检查图像是否是单色的

时间:2014-12-22 18:59:36

标签: .net image-processing

我需要快速检查是否有单色图像。我的意思是我需要验证图像只包含一种颜色(黑色,白色,红色方块......),而不是包含多种颜色。

当然,我可以先将所有图像像素进行比较,但速度可能会很慢。还有其他检查方式吗?

2 个答案:

答案 0 :(得分:3)

这取决于你对慢的定义。我发现,如果需要评估所有像素,扫描1MP图像需要大约12 ms,并且在随机采样图像上显着缩短(大多数情况下为纳秒,因为第一和第二像素不同)。

测试代码(W8.1 x64上的Core i5,在.Net 4.5上使用/unsafe /platform:x64编译):

private unsafe bool CheckBitmapIsMonotonic(Bitmap newBitmap)
{
    var data = newBitmap.LockBits(new Rectangle(Point.Empty, newBitmap.Size),
        ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
    try
    {
        byte* pixelData = (byte*)data.Scan0.ToPointer();
        uint firstPixelData = *((uint*)pixelData);

        for (int row = 0; row < data.Height; row++)
        {
            uint* cRowPointer = (uint*)(pixelData + data.Stride * row);

            for (int column = 0; column < data.Width; column++)
            {
                var rgbPixelValue = cRowPointer[column];

                if (firstPixelData != rgbPixelValue)
                {
                    return false;
                }
            }
        }

        return true;
    }
    finally
    {
        newBitmap.UnlockBits(data);
    }
}

这只是第一次通过。您可以通过移至ulong而不是uint来挤出一些额外的效果,并一次比较两个像素,如果可以避免转换为ARGB,那就更好了。< / p>

答案 1 :(得分:1)

这在很大程度上取决于您希望支持的图像格式(PNG,BMP等)。

例如,如果图像使用调色板(某些类型的PNG),您可以检查调色板是否只有一个颜色条目。 (请参阅System.Drawing.Image.Palette)。

但总的来说,您可能需要检查每个像素才能确定。