我正在尝试编写一个遍历我的图像并逐行计算所有像素的代码,并告诉我图像中有多少白色和多少黑色像素? (假设我的图像是由白色背景下的黑色字符组成的)
var backgroundPixels = 0;
for (int x = 0; x < bmp.Width; x++)
{
for (int y = 0; y < bmp.Height; y++)
{
if (bmp.GetPixel(x, y).Equals(Color.White))
{
backgroundPixels++;
}
}
}
label3.Text = Convert.ToString(backgroundPixels);
我遇到问题,因为代码由于某种原因无效。有人可以帮帮我吗?
答案 0 :(得分:3)
它不起作用,因为你正在比较颜色结构:
if (bmp.GetPixel(x, y).Equals(Color.White))
&#34;姓名&#34;结构的成员不会是&#34; White&#34;在你的像素上,它将是一个包含十六进制值&#34; ffffff&#34;的字符串,所以即使ARGB值相同,对象也是不同的。您需要比较ARGB值。 Color结构就像那样愚蠢。
if (bmp.GetPixel(x, y).ToArgb().Equals(Color.White.ToArgb()))
另一种可能性是你的像素实际上不是黑白而是灰度。
答案 1 :(得分:3)
使用==
或Equals
时,你不是逐字节比较ARGB的值,因为'=='运算符是这样完成的
public static bool operator ==(Color left, Color right)
{
if (left.value != right.value || (int) left.state != (int) right.state || (int) left.knownColor != (int) right.knownColor)
return false;
if (left.name == right.name)
return true;
if (left.name == null || right.name == null)
return false;
else
return left.name.Equals(right.name);
}
以下是如何在.net
中完成Equals
方法
public override bool Equals(object obj)
{
if (obj is Color)
{
Color color = (Color) obj;
if (this.value == color.value && (int) this.state == (int) color.state && (int) this.knownColor == (int) color.knownColor)
{
if (this.name == color.name)
return true;
if (this.name == null || color.name == null)
return false;
else
return this.name.Equals(this.name);
}
}
return false;
}
要克服您的问题,您应该使用发送32位当前颜色的ToArgb()
函数转换为ARGB
private void button1_Click(object sender, EventArgs e)
{
int whiteColor = 0;
int blackColor = 0;
for (int x = 0; x < bmp.Width; x++)
{
for (int y = 0; y < bmp.Height; y++)
{
Color color = bmp.GetPixel(x, y);
if (color.ToArgb()==Color.White.ToArgb())
{
whiteColor++;
}
else
if (color.ToArgb() == Color.White.ToArgb())
{
blackColor++;
}
}
}
}
答案 2 :(得分:1)
Equals()
方法不只是比较您的ARGB颜色。
这意味着RGB = 0,0,0(黑色)的颜色不与Color.Black
相同。
尝试使用以下内容进行比较:
if (bmp.GetPixel(x, y).ToArgb().Equals(Color.White.ToArgb()))
或
if (bmp.GetPixel(x, y).ToArgb() == Color.White.ToArgb())