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         {             // 省略         }     } | 
とやればよいということになります。
