私には次の仕事があります。ベース画像を取り、その上に別の画像をオーバーレイします。ベース画像は8bpngとオーバーレイです。これがベース(左)とオーバーレイ(右)の画像です。
結果とその外観を次に示します。
左側の画像は、ある画像が別の画像(htmlとポジショニング)の上にあるときのスクリーンショットであり、2番目の画像はプログラムによるマージの結果です。
スクリーンショットでわかるように、テキストの境界線は暗くなります。こちらも画像のサイズです
- ベースイメージ14.9KB
- オーバーレイ画像6.87KB
- 結果画像34.8KB
結果の画像のサイズも巨大です
これらの写真をマージするために使用するコードは次のとおりです
/*...*/
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を操作するためのより良いツールはありますか?