我需要快速检查是否有单色图像。我的意思是我需要验证图像只包含一种颜色(黑色,白色,红色方块......),而不是包含多种颜色。
当然,我可以先将所有图像像素进行比较,但速度可能会很慢。还有其他检查方式吗?
答案 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)。
但总的来说,您可能需要检查每个像素才能确定。