我有以下任务。拍摄一个基本图像并在其上叠加另一个。基本图像是 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?