私は.NET 4.0を使用しています。私はこれがフレームワークのバグかGDI +のものかどうかはわかりません。私はちょうど色チャンネルを交換するためのアプリを書いている間にそれを発見した。アルファ値が0の色の値が黒く表示されます
問題を説明してみましょう。あるビットマップからピクセルを読み込み、チャンネルを入れ替えて別のビットマップに書き出しています。 (具体的には、出力画像のRGB値を入力画像のアルファに、出力アルファを入力のグリーンチャネルに等しく設定しています。または、A => RGBとG => Aです。次のように:
for (int y = 0; y < input.Height; y++)
{
for (int x = 0; x < input.Width; x++)
{
Color srcPixel = input.GetPixel(x, y);
int alpha = srcPixel.A;
int green = srcPixel.G;
Color destPixel = Color.FromArgb(green, alpha, alpha, alpha);
output.SetPixel(x, y, destPixel);
}
}
を同様に、私はこの試みた:ほとんどの部分について
int color = green << 24 | alpha << 16 | alpha << 8 | alpha;
Color destPixel = Color.FromArgb(color);
output.SetPixel(x, y, destPixel);
、それが動作します。
問題点:RGBの値に関係なく、アルファがゼロの場合、結果のRGB値は常に純粋な黒(R:0、G:0、B:0)です。私はこれが何らかのFromArgb()最適化であるかどうかわかりません。.NET Reflectorを使用して、FromArgb()が何か変なことをしていないか、Bitmap.SetPixelが原因です。ネイティブコードと私はそれを見ることはできません。どちらの方法でも、アルファがゼロの場合、ピクセルは黒です。これはではない私が期待した動作です。私はRGBチャンネルをそのまま維持する必要があります。
最初は私がそれを事前に乗算されたアルファの問題だと思っていました。なぜなら、自家製のDDSローダー(私は仕様に基づいて作成したもので、何も問題を与えていない)を使ってDDSファイルをロードしているからです。このように、255の明示的なアルファを指定します - それらのどれもが、黒が判明していない、すなわち -
Color destPixel = Color.FromArgb(255, alpha, alpha, alpha);
... RGBチャンネルが正しく表示されますので、間違いなく誤ってRGB値を安全にすることができ前提としてGDI +内の何かアルファがゼロの場合は無視されます...私にとっては、かなり愚かな仮定のように見えますが、何でも。
さらに問題を悪化させるのは、色の種類が不変で構造体には意味がありますが、色を作成してアルファを割り当てることができないということです。SetPixel()が原因であれば、とにかく問題はない。 (私はこれを設定した直後に再びピクセルを取得し、同じ結果を見てテストしました。ゼロアルファ=ゼロRGBです)。
私の質問:誰もこの問題に対処して、比較的簡単な回避策を思い付いていますか?私の依存関係を抑えるために、サードパーティのイメージライブラリをインポートするのは嫌ですが、GDI +は自分のカラーチャネルに関するバグの前提をしているので、選択肢がないかもしれません。
ありがとうございました。
編集:私はこれを解決しましたが、さらに7時間は回答を投稿できません。驚くばかり。