我有以下任务。拍摄一张基本图像并在其上叠加另一张图像。基本图像是 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
是否适合此工具,或者是否有更好的工具来处理 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/