3

私には次の仕事があります。ベース画像を取り、その上に別の画像をオーバーレイします。ベース画像は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を操作するためのより良いツールはありますか?
4

1 に答える 1

3

質問に対する答えは次のとおりです。1)例のようにデフォルトの引数値を使用する代わりに、引数CompositingQuality.Defaultを指定してメソッドToGraphicsを呼び出すだけです。

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

問題は、CompositingQuality.HighQualityにあります。これは、両方の画像の合成を1つにすることですが、2つの画像の合成を作成するのではなく、オーバーレイを作成する必要があります。

2)サイズは指定したものと同じになりますが、画像形式によるもので変更できません。

3)デスクトップ用のc#でプログラミングしている場合は、System.Drawingよりも私が知る限り最良の選択です。

于 2012-10-08T10:53:29.223 に答える