Vectorに画像ファイルの色を入れ替えてくれるフリーソフトを登録しました。
これは指定した色を別の色に置き換えることができるアプリです。
さてPNGファイルであれば透過が可能です。ところで透過を別の色に置き換える場合、どのようにすればいいでしょうか?
これはフィールド変数 BeforeColorに格納された置き換え前のColorと同じかどうかを判定するメソッドです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// フィールド変数 BeforeColorには置き換え前のColorが格納されている // 引数はBitmap.GetPixelメソッドが返した値である bool IsBeforeColor(Color color) { if (BeforeColor.IsEmpty) { if (color == Color.IsEmpty) return true; else return false; // 常にfalseを返す } else { // 省略 } } |
残念ながらこれだとうまくいきません。透過色の場合、if文のなかでtrueを返してほしいのですが、そうはなってくれません。
以下のような実験コードを実行してみると
color1 != color2
color1.ToArgb() == color2.ToArgb()
color1.ToString() : Color [Empty]
color2.ToString() : Color [A=0, R=0, G=0, B=0]
color2 != Color.Empty
color2.IsEmpty == false
と表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Bitmap bitmap = new Bitmap(1, 1); Color color1 = Color.Empty; bitmap.SetPixel(0, 0, color1); Color color2 = bitmap.GetPixel(0, 0); bitmap.Dispose(); if (color1 == color2) Console.WriteLine("color1 == color2"); else Console.WriteLine("color1 != color2"); if (color1.ToArgb() == color2.ToArgb()) Console.WriteLine("color1.ToArgb() == color2.ToArgb()"); else Console.WriteLine("color1.ToArgb() != color2.ToArgb()"); Console.WriteLine("color1.ToString() : " + color1.ToString()); Console.WriteLine("color2.ToString() : " + color2.ToString()); if (color2 == Color.Empty) Console.WriteLine("color == Color.Empty"); else Console.WriteLine("color != Color.Empty"); if (color2.IsEmpty) Console.WriteLine("color2.IsEmpty == true"); else Console.WriteLine("color2.IsEmpty == false"); |
Color.Empty.ToArgb() == 0であってもColor.Emptyと同じ場合もあるし、そうでない場合もあります。両者はどのように区別すればいいのでしょうか?
Color.EmptyはToArgb() == 0ではあるけれども、Color.FromArgb(0)と同じではありません。Color.FromArgb(0).IsEmptyは偽を返します。これで両者の区別ができそうです。
ということで最初の例では
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
bool IsBeforeColor(Color color) { if (BeforeColor.ToArgb() == 0) { // if (color == Color.IsEmpty)ではなく if (color.ToArgb() == 0) return true; else return false; } else { // 省略 } } |
とやればよいということになります。