3

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

叠加图像 叠加图像

这是一个结果以及它的外观。

在此处输入图像描述 在此处输入图像描述

左图是一张图片在另一张(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一个合适的工具,还是有更好的工具来处理.NET的png?
4

1 回答 1

3

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

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

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

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

3) 如果您使用 c# 进行桌面编程,据我所知 System.Drawing 是最佳选择。

于 2012-10-08T10:53:29.223 回答