我想弄清楚图像是否是彩色的。在this https://stackoverflow.com/questions/2150504/how-can-i-check-the-color-depth-of-a-bitmapStackOverflow问题,有一个回复说我应该检查PixelFormat
的枚举Image
。不幸的是,我的答复不是很清楚。检查是否安全image.PixelFormat
不同于PixelFormat.Format16bppGrayScale
考虑到它是彩色图像?枚举的其他值呢? MSDN文档不是很清楚...
您可以通过避免 Color.FromArgb 并迭代字节而不是整数来改进这一点,但我认为这对您来说更具可读性,并且作为一种方法更容易理解。
总体思路是将图像绘制为已知格式的位图(32bpp ARGB),
然后检查该位图是否包含任何颜色。
锁定位图的位允许您比使用 GetPixel(使用不安全代码)更快地迭代其颜色数据许多倍。
如果一个像素的 alpha 为 0,那么它显然是灰度的,因为 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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)