Color.GetPixel()。equals(Color.Blue)的结果出错

时间:2015-03-07 21:42:01

标签: c# colors getpixel

Color c1 = image.GetPixel (7, 400);
Color c2 = Color.Blue;
Console.WriteLine (image.GetPixel (7, 400));
Console.WriteLine (Color.Blue);
Console.WriteLine (c1.Equals(c2));

控制台输出:

Color [A=255, R=0, G=0, B=255]
Color [Blue]
False

我是C#的新手,我不知道为什么这会返回false。任何人都可以给我一些见解,为什么这不起作用?

我试图在这种情况下使用它。

for (int i = 0; i < image.Height; i++)  //loop through rows
            {
            for (int j = 0; j < image.Width; j++) //loop through columns
            {
                //Console.WriteLine ("i = " + i);
                //Console.WriteLine ("j = " + j);
                if ((image.GetPixel (i, j)) == Color.Blue) 
                {
                    return new Tuple<int, int>(i,j);
                }

                if (i == image.Height-1 && j == image.Width-1) 
                {
                    Console.WriteLine ("Image provided does not have a starting point. \n" +
                                                 "Starting points should be marked by Blue.");
                    Environment.Exit (0);
                }
            }
        }

1 个答案:

答案 0 :(得分:4)

如您所知,以下示例将返回false:

Bitmap bmp = new Bitmap(1, 1);
bmp.SetPixel(0, 0, Color.Blue);
Color c1 = bmp.GetPixel(0, 0);
Console.WriteLine("GetPixel:" + c1);
Console.WriteLine("Color:" + Color.Blue);
Console.WriteLine("Equal?:" + c1.Equals(Color.Blue));

Console.ReadLine();

原因有点难以理解:

如果你看一下Bitmap-Class的源代码,你会发现

public Color GetPixel(int x, int y) { 
   //lot of other code     
   return Color.FromArgb(color); 
 } 

http://reflector.webtropy.com/default.aspx/DotNET/DotNET/8@0/untmp/whidbey/REDBITS/ndp/fx/src/CommonUI/System/Drawing/Bitmap@cs/1/Bitmap@cs

Color.Equals()的文档说:

  

要仅根据其ARGB值比较颜色,您应该使用   ToArgb方法。这是因为Equals and Equality成员   使用不仅仅是ARGB值来确定等效性   颜色。例如,不考虑Black和FromArgb(0,0,0)   相等,因为黑色是命名颜色而FromArgb(0,0,0)不是。

https://msdn.microsoft.com/en-us/library/e03x8ct2(v=vs.110).aspx

因此,返回的颜色不等于Color.Blue - 即使它在ARGB值方面为Color.Blue

要绕过此功能,请使用:

Console.WriteLine("Equal?:" + c1.ToArgb().Equals(Color.Blue.ToArgb()));

作为示例的最后一行。