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