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);
}
}
}
答案 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);
}
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()));
作为示例的最后一行。