2012-05-08 103 views
1

我在Visual Studio C#中制作了一个程序,它可以检测颜色,然后用该颜色找到该像素的x,y坐标。我已经完成了研究,但是我能找到的只有你已经给出了坐标,并且它感知了颜色,但这并不是我想要的,我想给出颜色,并找到坐标。有人知道怎么做吗?谢谢查找颜色的像素坐标

+0

你打算如何给颜色RGB或只是一种颜色蓝色? –

+0

最有可能的RGB,但我不确定这是什么功能......这就是我要求的。 – Pugmatt

+2

你会在哪里找到这些信息?你显然应该遍历所有的x和y,测试它们是否在你所寻求的颜色中。 – SimpleVar

回答

0

1)加载你的纹理作为字节数组。例如,如果你的纹理是2x2的大小, 它应该是这个样子:其中: 000 - RGB(0,0) 111 - RGB在(1,0) 222 - RGB(0, 1) 333 - RGB(1,1) 000或111表示它有3个字节,其中每个字节为红色,绿色或蓝色。 一旦你完成了,你可以遍历所有x和y, 并检查当前位置的颜色是否与你搜索的颜色相匹配。

3

您可以将图像提供给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是图像中像素的数量。对于小型和中等尺寸的照片来说,这并不算太坏,但对于巨大的图像,您可能会注意到您的程序挂起。

+1

对于性能,您可能会尝试将搜索分解为多个分段并搜索较小的分段。 – Reddog

0

你可以使用你已经找到的方法。检查每个坐标处的每个像素以找到与用户输入的颜色相同的颜色。从0开始,0.然后递增X值直到它位于像素行的末尾。每当X值位于行末时,递增Y值并将X重置为0.一旦获得与用户输入的颜色值相等的颜色值,则最后使用的X和Y坐标在找到匹配之前是回馈给用户的。

3

你可以做什么@ 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)); 
      } 
     } 
    } 

然后使用this image,你得到这样的事情(不整这个,因为它为〜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 = 0颜色[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颜色[A = 255,R = 90,G = 70,B = 59]
颜色[A = 255,R = 151,G = 156, 颜色[A = 255,R = 147,G = 109 ,A = 255,R = 220,G = 175,B = 134]
颜色[A = 255,R = 252,G = 204,B = 164]
颜色[颜色[A = 255,R = 126,G = 104,B = 91]
颜色[A = 255,R = 108,G = 94] = 255,R = 219,G = 187,B = 162]
[A = 255,R = 139,G = 137,B = 142]
颜色[A = 255,R = 241,G = 235,B = 239]
颜色[颜色[A = 255,R = 146,G​​ = 172,B = 187]
颜色[A = 255,R = 17,G = 62] = 255,R = 83,G = 92,B = 101]
,B = 85]
颜色[A = 255,R = 40,G = 106,B = 138]
颜色[A = 255,R = 33,G = 116,B = 146]
颜色[A = 255,R = 5颜色[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 = 5,G = 119,B = 120]

颜色[A = 255,R = 21,G = 颜色[A = 255,R = 8,G = 120,B = 121]颜色[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 
    } 
}