web-dev-qa-db-ja.com

Graphics.DrawImage()を使用して、透明度/アルファチャンネルで画像を描画する

画像をコピーしています。 (私の実際のコードは画像のサイズを変更していますが、それは私の質問には関係ありません。)私のコードは次のようになります。

_Image src = ...

using (Image dest = new Bitmap(width, height))
{
    Graphics graph = Graphics.FromImage(dest);
    graph.InterpolationMode = InterpolationMode.HighQualityBicubic;
    graph.DrawImage(src, 0, 0, width, height);
    dest.Save(filename, saveFormat);
}
_

これは、srcが透明な画像(GIFなど)またはアルファチャネル(PNGなど)から読み込まれない限り、うまく機能するようです。

DrawImage()を取得して透明度/アルファチャネルを新しいイメージに転送し、ファイルを保存するときにそれらを保持するにはどうすればよいですか?

15
Jonathan Wood

それはかなり不明瞭です、あなたが言わなかった多くがあります。透明性に関する最大の問題は、見えないことです。いくつかの手順をスキップし、新しいビットマップのピクセル形式を明示的に指定せず、初期化せず、使用する出力形式を指定しませんでした。透明度をサポートしないものもあります。それで、それを非常に明確にするバージョンを作りましょう。 Paint.netでこのように見えるPNG画像から:

enter image description here

このコードを使用する

        using (var src = new Bitmap("c:/temp/trans.png"))
        using (var bmp = new Bitmap(100, 100, PixelFormat.Format32bppPArgb)) 
        using (var gr = Graphics.FromImage(bmp)) {
            gr.Clear(Color.Blue);
            gr.DrawImage(src, new Rectangle(0, 0, bmp.Width, bmp.Height));
            bmp.Save("c:/temp/result.png", ImageFormat.Png);
        }

この画像を生成します:

enter image description here

青い背景がはっきりと見えるので、透明度が機能しました。

28
Hans Passant

私は同じ問題を抱えていたのでこのスレッドを見つけました(つまり、DrawImageはアルファチャネルをコピーしませんでした)が、私の場合は単にPixelFormat.Format32bppRgb の代わりに PixelFormat.Format32bppArgb。だから、Lukasz Mがコメントで言ったことはほとんど。

1
Alex