我想弄清楚图像是否是彩色的。在 this StackOverflow 问题,有一个回复说我应该检查 Image
的 PixelFormat
枚举。不幸的是,我的答复不是很清楚。检查 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/