我正在 Visual Studio C# 中制作一个可以检测颜色的程序,然后找到具有该颜色的像素的 x、y 坐标。我做过研究,但我能找到的只是你已经给出了坐标,它会感知颜色,但这不是我想要的,我想给出颜色,它会找到坐标。有人知道怎么做吗?谢谢
4 回答
您可以将图像提供给 Bitmap 对象,然后调用 getPixel(x, y) 方法来获取特定点的像素。由于 Bitmap 对象具有图像的尺寸,因此您可以遍历每个像素(YIKES!),测试与所需颜色的匹配。getPixel() 返回一个 Color 对象,您可以使用它。这是我超级快速完成的事情。pictureBox1 是我表单上的一个 PictureBox 元素。
Bitmap b = new Bitmap(pictureBox1.Image);
Color c = b.GetPixel(0,0);
但请记住,搜索匹配像素的情况更糟 O(n),其中 n 是图像中的像素数。对于小型和中型图片,这还不算太糟糕,但对于大型图片,您可能会注意到您的程序挂起。
你可以按照@kevin628 所说的做,但是添加一个for
语句,所以它会像这样搜索每个像素:
private void GetPixels()
{
Bitmap b = new Bitmap(pictureBox1.Image);
List<Color> colorList = new List<Color>
{
};
for (int y = 0; y < b.Height; y++)
{
for (int x = 0; x < b.Width; x++)
{
colorList.Add(b.GetPixel(x, y));
}
}
}
然后使用这个图像,你会得到这样的东西(不是整个这个,因为它是 ~50000 行):
颜色 [A=255, R=247, G=240, B=136]
颜色 [A=255, R=252, G=247, B=155]
颜色 [A=255, R=242, G=238, B=164]
颜色 [A=255, R=79, G=124, B=103]
颜色 [A=255, R=79, G=124, B=103]
颜色 [A=255, R=0, G=42, B=17]
颜色[A=255, R=16, G=104, B=90]
颜色[A=255, R=15, G=114, B=109]
颜色[A=255, R=33, G=125, B=124]
颜色[A=255, R=11, G=83, B=80]
颜色[A=255, R=36, G=72, B=68]
颜色[ A=255, R=151, G=156, B=150]
颜色[A=255, R=90, G=70, B=59]
颜色[A=255, R=147, G=109, B= 88]
颜色 [A=255, R=252, G=204, B=164]
颜色 [A=255, R=220, G=175, B=134] 颜色 [A=255, R=126, G= 104,乙=91]
颜色 [A=255, R=219, G= 187,乙=162]
颜色 [A=255, R=108, G=94, B=93]
颜色 [A=255, R=241, G=235, B=239]
颜色[A=255, R=139, G=137, B=142]
颜色[A=255, R=83, G=92, B=101]
颜色[A=255, R=146, G=172, B=187]
颜色[A=255, R=17, G=62, B=85]
颜色[A=255, R=40, G=106, B=138]
颜色[A=255, R=33, G=116, B=146]
颜色[A=255, R=5, G=96, B=117]
颜色[A=255, R=0, G=79, B=84]
颜色[ A=255, R=6, G=94, B=80]
颜色 [A=255, R=27, G=114, B=98]
颜色 [A=255, R=40, G=130, B= 131]
颜色[A=255, R=19, G=116, B=125]
颜色[A=255, R=21, G=128, B=134]
颜色[A=255, R=5, G= 119,乙=120]
颜色 [A=255, R=8, G=120, B=121]
颜色 [A=255, R=11, G=107, B=105]
颜色 [A=255, R=46, G=113, B=106]
颜色 [A=255, R=21, G=70, B=49]
颜色 [A=255, R=45, G=123, B=99]
然后要测试颜色,只需执行以下操作:
for (int i = 0; i < colorList.Count; i++)
{
Color c = Color.Black;
if (c == colorList[i])
{
//do something
}
}
1)将您的纹理加载为字节数组。例如,如果您的纹理是 2x2 大小,它应该看起来像: 000111222333 其中: 000 - RGB 在 (0,0) 111 - RGB 在 (1,0) 222 - RGB 在 (0,1) 333 - RGB 在(1,1) 000 或 111 表示它有 3 个字节,其中每个字节是红色、绿色或蓝色。完成后,您可以遍历所有 x 和 y,并检查当前位置的颜色是否与您搜索的颜色匹配。
你可以使用你已经找到的方法。检查每个坐标处的每个像素以找到与用户输入的颜色相同的颜色。从 0、0 开始。然后递增 X 值,直到它位于像素行的末尾。每次 X 值位于行尾时,增加 Y 值并将 X 重置为 0。一旦获得与用户输入的颜色值相等的颜色值,则最后使用的 X 和 Y 坐标在找到匹配项之前将返回给用户的内容。