画像をコピーしています。 (私の実際のコードは画像のサイズを変更していますが、それは私の質問には関係ありません。)私のコードは次のようになります。
_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()
を取得して透明度/アルファチャネルを新しいイメージに転送し、ファイルを保存するときにそれらを保持するにはどうすればよいですか?
それはかなり不明瞭です、あなたが言わなかった多くがあります。透明性に関する最大の問題は、見えないことです。いくつかの手順をスキップし、新しいビットマップのピクセル形式を明示的に指定せず、初期化せず、使用する出力形式を指定しませんでした。透明度をサポートしないものもあります。それで、それを非常に明確にするバージョンを作りましょう。 Paint.netでこのように見えるPNG画像から:
このコードを使用する
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);
}
この画像を生成します:
青い背景がはっきりと見えるので、透明度が機能しました。
私は同じ問題を抱えていたのでこのスレッドを見つけました(つまり、DrawImageはアルファチャネルをコピーしませんでした)が、私の場合は単にPixelFormat.Format32bppRgb
の代わりに PixelFormat.Format32bppArgb
。だから、Lukasz Mがコメントで言ったことはほとんど。