Sim*_*Var 13
您可以通过避免Color.FromArgb来改进这一点,并迭代字节而不是整数,但我认为这对您来说更具可读性,并且更容易理解为一种方法.
一般的想法是将图像绘制成已知格式的位图(32bpp ARGB),然后检查该位图是否包含任何颜色.
锁定位图的位允许您使用不安全的代码比使用GetPixel快几倍地迭代它的颜色数据.
如果像素的alpha为0,那么它显然是GrayScale,因为alpha 0意味着它完全不透明.除此之外 - 如果R = G = B,则它是灰色的(如果它们= 255,则它是黑色的).
private static unsafe bool IsGrayScale(Image image)
{
using (var bmp = new Bitmap(image.Width, image.Height, PixelFormat.Format32bppArgb))
{
using (var g = Graphics.FromImage(bmp))
{
g.DrawImage(image, 0, 0);
}
var data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat);
var pt = (int*)data.Scan0;
var res = true;
for (var i = 0; i < data.Height * data.Width; i++)
{
var color = Color.FromArgb(pt[i]);
if (color.A != 0 && (color.R != color.G || color.G != color.B))
{
res = false;
break;
}
}
bmp.UnlockBits(data);
return res;
}
}
Run Code Online (Sandbox Code Playgroud)