c# - .NET中的PNG图像处理

标签 c# .net image png

我有以下任务。拍摄一张基本图像并在其上叠加另一张图像。基本图像是 8b png 以及叠加层。 这是基础(左)和叠加(右)图像。

Overlay image Overlay image

这是结果及其外观。

enter image description here enter image description here

左边的图片是一张图片在另一张图片之上(html 和定位)时的屏幕截图,第二张是程序化合并的结果。

如您在屏幕截图中所见,文本的边框较暗。这里还有图片的大小

  • 基本图像 14.9 KB
  • 叠加图片 6.87 KB
  • 结果图片 34.8 KB

生成的图片也很大

这是我用来合并这些图片的代码

/*...*/
public Stream Concatinate(Stream baseStream, params Stream[] overlayStreams) {
    var @base = Image.FromStream(baseStream);
    var canvas = new Bitmap(@base.Width, @base.Height);
    using (var g = canvas.ToGraphics()) {
        g.DrawImage(@base, 0, 0);
        foreach (var item in overlayStreams) {
            using (var overlayImage = Image.FromStream(item)) {
                try {
                    Overlay(@base as Bitmap, overlayImage as Bitmap, g);
                } catch {

                }
            }
        }
    }
    var ms = new MemoryStream();
    canvas.Save(ms, ImageFormat.Png);
    canvas.Dispose();
    @base.Dispose();
    return ms;
}

/*...*/
/*Tograpics extension*/
public static Graphics ToGraphics(this Image image,
    CompositingQuality compositingQuality = CompositingQuality.HighQuality,
    SmoothingMode smoothingMode = SmoothingMode.HighQuality,
    InterpolationMode interpolationMode = InterpolationMode.HighQualityBicubic) {
    var g = Graphics.FromImage(image);

    g.CompositingQuality = compositingQuality;
    g.SmoothingMode = smoothingMode;
    g.InterpolationMode = interpolationMode;
    return g;
}
private void Overlay(Bitmap source, Bitmap overlay, Graphics g) {
    if (source.Width != overlay.Width || source.Height != overlay.Height)
        throw new Exception("Source and overlay dimensions do not match");
    var area = new Rectangle(0, 0, source.Width, source.Height);
    g.DrawImage(overlay, area, area, GraphicsUnit.Pixel);
}

我的问题是

  • 我应该怎么做才能合并图像以获得屏幕截图中的结果?
  • 如何缩小结果图片的大小?
  • System.Drawing 是否适合此工具,或者是否有更好的工具来处理 png for .NET?

最佳答案

您的问题的答案是: 1) 只需使用参数 CompositingQuality.Default 调用方法 ToGraphics,而不是像示例中那样使用默认参数值:

using (var g = canvas.ToGraphics(compositingQuality: CompositingQuality.Default)) 

CompositingQuality.HighQuality 的问题在于它将两个图像合成为一个图像,但您想要叠加,而不是将两个图像合成。

2) 尺寸将与您指定的尺寸相似且无法更改,这是由于图像格式。

3) 如果您正在为桌面使用 c# 编程,那么据我所知,System.Drawing 是最佳选择。

关于c# - .NET中的PNG图像处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12770175/

相关文章:

html - 尝试将 "information button"添加到我页面上的图片中,该图片仅在悬停时出现

c# - 等待具有不同结果的多个任务

c# - ASP MVC 编译时包含部分 View

c# - “does not contain a definition…and no extension method..” 错误

image - 锥体图像细化

php - 如何将图像从文件夹保存到数据库

c# - ThreadAbortException 调用 OdbcDataReader.ExecuteReader()

c# - 当我尝试添加实体时 Entity Framework 中的 InnerException

c# - Entity Framework 4.1 中带有 TransactionScope 的多个 dbcontext 的 SaveChanges()

c# - 当 gridview 具有 autogeneratecolumns=true 时如何更改 datagridview 列日期格式