检查图像是否有颜色

Kas*_*sem 4 .net c# gdi+ image pixelformat

我想弄清楚图像是否有颜色.在这个 StackOverflow问题上,有一个回复说我应该检查PixelFormat枚举Image.不幸的是,回复对我来说不是很清楚.检查它是否与彩色图像image.PixelFormat不同是否安全PixelFormat.Format16bppGrayScale?枚举的其他值怎么样?MSDN文档不是很清楚......

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)