2012-05-08 2 views
1

Я делаю программу в Visual Studio C#, которая может обнаружить цвет, а затем найти координату x, y этого пикселя с этим цветом. Я сделал исследование, но все, что я могу найти, это то, что вы уже даете координату, и она ощущает цвет, это не то, что я хочу, хотя я хочу дать цвет, и он находит координату. Кто-нибудь знает, как это сделать? СпасибоНайти координаты пикселя цвета

+0

Как вы собираетесь отдавать цвет RGB или только синий цвет? –

+0

Скорее всего, RGB, но я не совсем уверен, что это за функция ... вот что я прошу. – Pugmatt

+2

Где вы найдете эту информацию? Очевидно, вы должны пройти через все x и y, проверяя, находятся ли они в том цвете, который вы ищете. – SimpleVar

ответ

0

1) Загрузите текстуру в виде массива байтов. Например, если ваша текстура размер 2х2, он должен выглядеть примерно так: Где: 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); 

Однако следует помнить, что поиск согласующего пикселя худший случай О (п), где п есть число пикселей в изображении. Для маленьких и, возможно, изображений среднего размера это не так уж плохо, но для огромных изображений вы можете заметить, что ваша программа зависла.

+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 строк):

Цвет [А = 255, R = 247, G = 240, B = 136]
цвет [А = 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 , В = 88]
цвет [А = 255, R = 252, G = 204, B = 164]
цвет [А = 255, R = 220, G = 175, B = 134]
Цвет [А = 255, R = 219, G = 187, B = 162]
Цвет [A = 255, R = 126, G = 104, B = 91]
Цвет [A = 255, R = 108, G = 94 , В = 93]
цвет [А = 255, R = 241, G = 235, B = 239]
цвет [А = 255, R = 139, G = 137, B = 142]
Цвет [А = 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, B = 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]
цвет [А = 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 
    } 
} 
Смежные вопросы