Я делаю программу в Visual Studio C#, которая может обнаружить цвет, а затем найти координату x, y этого пикселя с этим цветом. Я сделал исследование, но все, что я могу найти, это то, что вы уже даете координату, и она ощущает цвет, это не то, что я хочу, хотя я хочу дать цвет, и он находит координату. Кто-нибудь знает, как это сделать? СпасибоНайти координаты пикселя цвета
ответ
1) Загрузите текстуру в виде массива байтов. Например, если ваша текстура размер 2х2, он должен выглядеть примерно так: Где: 000 - RGB (0,0) 111 - RGB в точке (1,0) 222 - RGB в точке (0, 1) 333 - RGB в (1,1) 000 или 111 означает, что он имеет 3 байта, где каждый байт красного или зеленого или синего. Как только вы это сделаете, вы можете пропустить все x и y, и проверить, соответствует ли цвет в текущей позиции вашему искомому цвету.
Вы можете подать изображение в объект Bitmap, а затем вызвать метод getPixel (x, y), чтобы получить пиксель в определенной точке. Так как объект Bitmap имеет размеры изображения, вы можете перебирать каждый пиксель (YIKES!), Тестируя соответствие с нужным цветом. getPixel() возвращает объект Color, с которым вы можете работать. Вот что я сработал очень быстро. pictureBox1 - элемент PictureBox в моей форме.
Bitmap b = new Bitmap(pictureBox1.Image);
Color c = b.GetPixel(0,0);
Однако следует помнить, что поиск согласующего пикселя худший случай О (п), где п есть число пикселей в изображении. Для маленьких и, возможно, изображений среднего размера это не так уж плохо, но для огромных изображений вы можете заметить, что ваша программа зависла.
Для производительности вы можете попытаться разбить поиск на несколько сегментов и выполнить поиск по меньшим сегментам. – Reddog
Вы можете использовать метод, который вы уже нашли для этого. Проверяйте каждый пиксель в каждой координате, чтобы найти цвет, соответствующий цвету, который был введен пользователем. Начните с 0, 0. Затем увеличьте значение X до тех пор, пока оно не окажется в конце строки пикселей. Каждый раз, когда значение X находится в конце строки, увеличьте значение Y и установите X в 0. Когда вы получите значение цвета, равное значению цвета, которое было введено пользователем, последние использованные координаты X и Y прежде чем найти совпадение - это то, что возвращается пользователю.
Вы можете делать то, что @ 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
}
}
Как вы собираетесь отдавать цвет RGB или только синий цвет? –
Скорее всего, RGB, но я не совсем уверен, что это за функция ... вот что я прошу. – Pugmatt
Где вы найдете эту информацию? Очевидно, вы должны пройти через все x и y, проверяя, находятся ли они в том цвете, который вы ищете. – SimpleVar