C# 如何确定位图是亮还是暗?

C# 如何确定位图是亮还是暗?,c#,image-processing,bitmap,C#,Image Processing,Bitmap,我想知道位图是亮还是暗。我意识到“相当明亮或黑暗”不是一个非常精确的定义,但我只需要想出一些非常简单的东西 我的想法是将位图转换为单色位图,然后比较白色像素和黑色像素的数量 这是我的C代码: private bool IsDark(位图) { 如果(位图==null) 返回true; var countWhite=0; var countBlack=0; //将位图转换为黑白(monchrome) var bwBitmap=bitmap.Clone(新矩形(0,0,bitmap.Width,bi

我想知道位图是亮还是暗。我意识到“相当明亮或黑暗”不是一个非常精确的定义,但我只需要想出一些非常简单的东西

我的想法是将位图转换为单色位图,然后比较白色像素和黑色像素的数量

这是我的C代码:

private bool IsDark(位图)
{
如果(位图==null)
返回true;
var countWhite=0;
var countBlack=0;
//将位图转换为黑白(monchrome)
var bwBitmap=bitmap.Clone(新矩形(0,0,bitmap.Width,bitmap.Height),PixelFormat.format1bpindexed);
对于(int x=0;xcountWhite;
}
我不明白的是:无论我使用什么位图,黑色像素的数量总是0

我错过了什么

另外:我确信有更有效的方法来解决这个问题。但在这一点上,我只想理解为什么上面的代码失败

谢谢大家!
Ingmar

首先,您可以尝试以下方法:

if (color.R == 0 && color.G == 0 && color.B == 0)
{
    // black
    countBlack++;
}
else if (color.R == 255 && color.G == 255 && color.B == 255)
{
    // white
    countWhite++;
}
else
{
    // neither black or white
}

由于旁注
GetPixel(x,y)
速度较慢,请看一看。

开始时,您可以尝试以下方法:

if (color.R == 0 && color.G == 0 && color.B == 0)
{
    // black
    countBlack++;
}
else if (color.R == 255 && color.G == 255 && color.B == 255)
{
    // white
    countWhite++;
}
else
{
    // neither black or white
}

由于旁注
GetPixel(x,y)
很慢,请看一看。

颜色。a
表示Alpha通道,它与黑白无关。请看,您的主要调整点现在位于
位图.Clone()
中,您几乎无法控制它。您还可以扫描位图,并为每个像素添加0..765值的R、G、B值。然后你可以将其平均或与特雷肖尔德一起计算。(在)亚历山德罗,就这样。当然,在运行代码时,我也检查了其他属性(例如R、g、B、Name),但它们总是指向白色。我不知道为什么我最后检查了Alpha通道。无论如何,这是一个愚蠢的想法。我现在正在检查颜色。Name==“ffffffff”,现在它可以工作了。(at)拉特纳和亨克:谢谢,但汤姆对我来说太复杂了。
color.A
表示阿尔法通道,它与黑白无关。看到这一点,你的主调谐点现在在
位图.Clone()
中,你几乎无法控制它。您还可以扫描位图,并为每个像素添加0..765值的R、G、B值。然后你可以将其平均或与特雷肖尔德一起计算。(在)亚历山德罗,就这样。当然,在运行代码时,我也检查了其他属性(例如R、g、B、Name),但它们总是指向白色。我不知道为什么我最后检查了Alpha通道。无论如何,这是一个愚蠢的想法。我现在正在检查颜色。Name==“ffffffffff”,现在它可以工作了。(at)拉特纳和亨克:谢谢,但汤姆为了我的目的把事情复杂化了。(at)亚历山德罗:是的,这个很好。谢谢感谢您提供位图.LockBits。我知道这一点,但正如我在最初的帖子中所写的,此时我只想了解我的代码有什么问题。(at)亚历山德罗:是的,这很好用。谢谢感谢您提供位图.LockBits。我知道这一点,但正如我在最初的帖子中所写的那样,此时我只想了解我的代码到底出了什么问题。