Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分别获取位图图像中黑白像素的总数_C#_Image_Bitmap - Fatal编程技术网

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

C# 分别获取位图图像中黑白像素的总数,c#,image,bitmap,C#,Image,Bitmap,我试图写一个代码,通过我的图像,并计数所有的像素行,并告诉我有多少白色和黑色像素在我的图像?(假设我的图像由白色背景下的黑色字符组成) var backgroundPixels=0; 对于(int x=0;x

我试图写一个代码,通过我的图像,并计数所有的像素行,并告诉我有多少白色和黑色像素在我的图像?(假设我的图像由白色背景下的黑色字符组成)

var backgroundPixels=0;
对于(int x=0;x

我有问题,因为代码不工作的原因。有人能帮我吗?

这不起作用,因为您正在比较颜色结构:

if (bmp.GetPixel(x, y).Equals(Color.White))
结构的“Name”成员在像素上不会是“White”,而是一个包含十六进制值“ffffff”的字符串,因此即使ARGB值相同,对象也是不同的。您需要比较ARGB值。颜色结构就是这样愚蠢

if (bmp.GetPixel(x, y).ToArgb().Equals(Color.White.ToArgb()))
另一种可能是,您的像素实际上不是黑白的,而是灰度。

使用
Equals()
方法比较的不仅仅是ARGB颜色。 这意味着RGB=0,0,0(黑色)的颜色与
color.black
不同

尝试使用以下方法进行比较:

if (bmp.GetPixel(x, y).ToArgb().Equals(Color.White.ToArgb()))


当您使用
=
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位当前颜色的函数转换为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++; 
                        }
                }

            }
        }
private void按钮1\u单击(对象发送者,事件参数e)
{
int-whiteColor=0;
int blackColor=0;
对于(int x=0;x
我已编辑了您的标题。请看,共识是“不,他们不应该”。那么,你能更详细地描述一下目前观察到的行为是什么吗?你所说的“不起作用”是什么意思?它会崩溃吗?这些值与实际值不一致吗?它不是解析所有像素吗?尝试使用
bmp的
R
G
B
。GetPixel(x,y)
你可以用MS Paint播放一点,并创建一个控制图像,看看它是否真的迭代所有像素,以及值是否正确递增。那么,我应该如何首先获得清晰的黑白位图图像?(不是灰度)您甚至不需要,只需检查值是否高于或低于某个阈值,而不是检查值是255还是0。例如,127=白色。如果是灰度,所有组件都应该是相同的,这样你就可以只检查其中一种颜色。斯文嘉:谢谢你的评论,我实际上需要在下一阶段的工作中将图像转换为黑白,如果你不知道怎么做,你能让我知道吗?谢谢
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;
    }
 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++; 
                        }
                }

            }
        }