c# - 检查图像是否着色

标签 c# .net image gdi+ pixelformat

我想弄清楚图像是否是彩色的。在 this StackOverflow 问题,有一个回复说我应该检查 ImagePixelFormat 枚举。不幸的是,我的答复不是很清楚。检查 image.PixelFormat 是否不同于 PixelFormat.Format16bppGrayScale 以认为它是彩色图像是否安全?枚举的其他值呢? MSDN 文档不是很清楚...

最佳答案

您可以通过避免 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;
    }
}

关于c# - 检查图像是否着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10333859/

相关文章:

图像魔术创建三角形

c# - 简单的 getJSON 不起作用

c# - 数据表选择行

c# - 是否可以在 WinForms 中以编程方式触发 "fake"滚动?

.net - .NET 事件的签名

C# 4.0 MemoryCache - 如何在对其依赖项进行更改时逐出依赖缓存条目

java - 如何在java中进行碰撞检测?

python - Shopify API Python 使用 Python API 上传多张图片

c# - 在 C# 中使用 if (!bool) 与 if (bool == false)

c# - 我在小数按钮上做错了什么,似乎我的 bool 值关闭了?