コード内およびオンデマンドで、32 ビット RGBA Image オブジェクト (元は 32 ビット PNG) を対応する 32 ビット グレースケールに変換したいと考えています。
ここで他のいくつかの質問と、オンラインの多くの記事を既に読みました。ColorMatrix を使用して試してみましたが、アルファをうまく処理していないようです。完全に不透明なグレースケールのピクセル。部分的に透明なピクセルは、それらのピクセルにまだ色の色合いがあるため、うまく変換されないように見えます。目立つだけで十分です。
私が使用する ColorMatrix は次のとおりです。
new System.Drawing.Imaging.ColorMatrix(new float[][]{
new float[] {0.299f, 0.299f, 0.299f, 0, 0},
new float[] {0.587f, 0.587f, 0.587f, 0, 0},
new float[] {0.114f, 0.114f, 0.114f, 0, 0},
new float[] { 0, 0, 0, 1, 0},
new float[] { 0, 0, 0, 0, 1}
});
私が読んだように、これはかなり標準的な NTSC 加重マトリックスです。次に、 とともに使用しますGraphics.DrawImage
が、前述のように、部分的に透明なピクセルにはまだ色が付けられています。PictureBox
これは、白い背景にWinForms を介して Image オブジェクトを表示していることに注意してください。おそらく、PictureBox が画像を描画し、透明な部分を処理する方法でしょうか? 背景色は影響していませんが (色の色合いは確かに元の画像からのものです)、おそらく PictureBox は透明なピクセルを正しく再描画していませんか?
OpacityMask と共に FormatConvertedBitmap を使用するメソッドをいくつか見てきました。主に、PresentationCore.dll をインポートする必要がないことを本当に望んでいるためです (言うまでもなく、.NET 2.0 限定アプリでは機能しません)。確かに、基本的な System.Drawing.* のものは、この簡単な手順を実行できますか? か否か?