分别获取位图图像中黑白像素的总数

时间:2014-01-28 12:40:43

标签: c# image bitmap

我正在尝试编写一个遍历我的图像并逐行计算所有像素的代码,并告诉我图像中有多少白色和多少黑色像素? (假设我的图像是由白色背景下的黑色字符组成的)

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);

我遇到问题,因为代码由于某种原因无效。有人可以帮帮我吗?

3 个答案:

答案 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())