|
分類:[C#]
開発環境: Visual Studio Community 2013
.NET Framework のバージョン: 4.5.1
----
こんにちは。
Bitmap の透明色 (アルファ値が 255 の色) の扱いについて、2 点質問させてください。
<<質問 1>>
new Bitmap() にて、新規に Bitmap を作成した時、全ピクセルの色は [A=0, R=0, G=0, B=0] となるようです。
これを、[A=0, R=255, G=255, B=255] で塗りつぶす方法が知りたいです。
Graphics.FillRectangle() や Graphics.Clear() を試してみましたが、[A=0, R=0, G=0, B=0] のままでした。
現状、仕方なく、全ピクセルに対してループ処理にて SetPixel(x, y, Color.Transparent) としています。
もっと良い方法 (一括で設定できる方法) はございませんでしょうか。
<<質問 2>>
ある Bitmap の [A=0, R=255, G=255, B=255] 色のピクセル上に
別の Bitmap を Graphics.DrawImage() で [A=0, R=255, G=255, B=255] 色のピクセルを描画すると、
ピクセル色が [A=0, R=0, G=0, B=0] に変化してしまいます。
これの原因および回避方法がわかりません。
(質問 1 と同様、1 ピクセルずつ色をコピーしていけば良いのかもしれませんが…。)
----
[A=0, R=255, G=255, B=255] も [A=0, R=255, G=255, B=255] も、
見た目は同じ透明というのは理解しております。
ですから、「どっちでも良いでしょ」と言われればそれまでなのですが、
色値が勝手に変化しているという点が気になり、せめて理由だけでも知ることができればとの思いから、
質問させていただきました。
----
以下、実験に使用したソースコードです。
※試してみてダメだった部分はコメント化しております。
private static void Test()
{
Bitmap bitmap1 = CreateTransparentBitmap();
Bitmap bitmap2 = CreateTransparentBitmap();
System.Diagnostics.Debug.WriteLine(bitmap1.GetPixel(0, 0)); // 出力: Color [A=0, R=255, G=255, B=255]
using (var g = Graphics.FromImage(bitmap1))
{
// g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
g.DrawImage(bitmap2, 0, 0);
}
System.Diagnostics.Debug.WriteLine(bitmap1.GetPixel(0, 0)); // 出力: Color [A=0, R=0, G=0, B=0]
}
// すべてのピクセルが [A=0, R=255, G=255, B=255] であるビットマップを作成する
private static Bitmap CreateTransparentBitmap()
{
// この時点では全てのピクセルが [A=0, R=0, G=0, B=0]
Bitmap bitmap = new Bitmap(50, 50);
// すべてのピクセルを [A=0, R=255, G=255, B=255] で塗りつぶす (もっと良い方法は?)
for (var y = 0; y < bitmap.Height; y++)
{
for (var x = 0; x < bitmap.Width; x++)
{
bitmap.SetPixel(x, y, Color.Transparent);
}
}
//// この方法はもNG ([A=0, R=0, G=0, B=0] のまま)
//using (var g = Graphics.FromImage(bitmap))
//{
// g.FillRectangle(Brushes.Transparent, 0, 0, bitmap.Width, bitmap.Height);
//}
//// この方法もNG ([A=0, R=0, G=0, B=0] のまま)
//using (var g = Graphics.FromImage(bitmap))
//{
// g.Clear(Color.Transparent);
//}
return bitmap;
}
|