如何找到图像中的所有像素都是灰度或每个像素的 R、G、B 值相等
Posted
技术标签:
【中文标题】如何找到图像中的所有像素都是灰度或每个像素的 R、G、B 值相等【英文标题】:How to find that all pixels in an image are grey scale or has R,G,B equal value for each individual pixel 【发布时间】:2016-04-02 14:53:45 【问题描述】:请不要引用此How can I check the color depth of a Bitmap? 或How to check if a picture is in grayScale
因为图像可以是每像素 24/32 位,即使所有唯一颜色都是灰度或小于 256 并且每个像素可以是 24 或 32 位。
如何找到图像Bitmap.GetPixel(x, y)
中的像素具有相等的 R、G、B 值,以便确定图像中的所有像素是否都在灰度范围内。因为一个灰度像素的 R,G,B 值是相同的。或者有没有更好的方法来判断图像是否为灰度?
我正在编写一个代码来压缩 16/24/32 位图像的大小,这样如果图像具有 256 种唯一颜色,则将其更改为 8 位图像并保存。
首先,我计算每像素超过 8 个的图像中的唯一颜色。
如果图像中的唯一颜色小于或等于 256 则
-
如果所有独特的颜色都在灰度范围内,则将其转换为灰度
否则,如果任何颜色不是灰度,则将图像转换为 8 BPP
uint UniqueColors(Bitmap Bitmap)
try
List<int> lstColors = new List<int>();
if (null == Bitmap)
return 0;
for (int iCount = 0; iCount < Bitmap.Height; iCount++)
for (int iCounter = 0; iCounter < Bitmap.Width; iCounter++)
if (!lstColors.Contains(Bitmap.GetPixel(iCounter, iCount).ToArgb()))
lstColors.Add(Bitmap.GetPixel(iCounter, iCount).ToArgb());
Bitmap.Dispose();
return Convert.ToUInt32(lstColors.Count);
catch (Exception)
Bitmap.Dispose();
return 0;
然后:
if (256 >= UniqueColors(new Bitmap(string ImagePath)))
if (Is_Greyscale(new Bitmap(ImagePath))
Convert_To_Greyscale(ImagePath);
else
Convert_To_8Bits(ImagePath);
现在我被困住了,如果图像中的每种独特颜色都在灰度范围内,我该如何找到。我的意思是每种独特的颜色都具有相等的 (R, G, B) 值。比如R=G=B。如何在我的代码行中找到它
Bitmap.GetPixel(iCounter, iCount).ToArgb()
【问题讨论】:
第一:GetPixel 很慢。所以在你的内部循环中两次不是一个好主意。要获得真正的速度,请查看 LockBits。第二:检查Color c = bmp.GetPixel(x,y);
只需执行bool isGrey = (c.R == c.G) && (c.G ==c.B);
【参考方案1】:
Bitmap.GetPixel()
返回一个Color
结构,其中包含R
、G
和B
字段,因此您可以随意比较它们。
请注意,使用GetPixel()
非常慢,但如果您不需要速度,它就可以了。
【讨论】:
谢谢,我很沮丧,以至于互联网上到处都有人建议 Image.PixelFormat 会给出错误的结果。因为图像可以有 256 种独特的颜色,但每种颜色可以是 24 位。因此,图像可以减少到每像素 8 位。以上是关于如何找到图像中的所有像素都是灰度或每个像素的 R、G、B 值相等的主要内容,如果未能解决你的问题,请参考以下文章