2012-05-18 11 views
9

イメージをコピーしています。 (私の実際のコードはイメージのサイズを変更していますが、それは私の質問には関係ありません)。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()さんは、透明画像/アルファチャンネルを新しい画像に転送し、ファイルを保存するときにそれらを保持するにはどうすればよいですか?

+0

質問は 'saveFormat'変数の値は何ですか? 'PixelFormat.Format32bppArgb'(あるいはアルファチャンネルを扱う別のフォーマット)でなければなりません。 'Image dest = new Bitmap(width、height、PixelFormat.Format32bppArgb))'を使ってみてください。 –

+0

これはアルファチャンネルでは機能しているようですが、GIFの透明では機能しません。 'saveFormat'は、入力ファイルのフォーマットによって異なります。入力ファイルがアルファチャンネルをサポートしていない場合は、画像にアルファチャンネルのピクセルが含まれていないと想定することは安全です。 –

+0

それでは、GIFファイルの 'saveFormat'の値は何ですか?:) –

答えて

22

かなり不明ですが、あなたが言っていないことがたくさんあります。透明性に関する最大の問題は、あなたがそれを見ることができないということです。いくつかの手順をスキップして、新しいビットマップのピクセル形式を明示的に指定せず、初期化せずに、使用する出力形式を指定していないとします。一部は透明性をサポートしていません。ですから、それを明瞭にするバージョンを作ってみましょう。このコード

 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

このイメージを生成します:paint.netで次のようになりますPNG画像から

enter image description here

あなたがはっきりと見ることができます青色の背景に透明性が働きました。

+1

まあ、私の意図は、入力ファイルと一致するフォーマットをサポートすることでした。私はかなり具体的だと思った。コードが1つのファイルタイプだけをサポートするものではないということだけです。多分、私は各ファイルタイプを扱うためのコードが必要です。わかりません。私はあなたが持っているようにPixelFormatを指定しようとしましたが、ファイルタイプが透過性を持つGIFであった場合にエラーを引き起こしているようでした。 PixelFormatを指定しなくても、PNGでうまく動作するように見えました。 –

+0

@ JonathanWoodは、古いビットマップの幅と高さ、および新しい希望のフォーマットで新しいビットマップを作成します。好ましくは 'using'ステートメントで、Graphicsオブジェクト' FromImage( '新しいビットマップ')と 'DrawImage('あなたの古いビットマップ ')を作成します。 –

関連する問題