Найти координаты пикселей цвета
Я делаю программу в Visual Studio C#, которая может обнаружить цвет, а затем найти координаты x, y этого пикселя с этим цветом. Я провел исследование, но все, что я могу найти, это то, что вы уже даете координату, и она чувствует цвет, но это не то, чего я хочу, я хочу дать цвет, и он находит координату. Кто-нибудь знает, как это сделать? Спасибо
4 ответа
Вы можете передать изображение в объект Bitmap, а затем вызвать метод getPixel(x, y), чтобы получить пиксель в определенной точке. Поскольку растровое изображение имеет размеры изображения, вы можете выполнять итерацию по каждому пикселю (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 = 219, G = 187, B = 162]
Цвет [A = 255, R = 126, G = 104, B = 91]
Цвет [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, 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]
Цвет [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 перед нахождением совпадения возвращаются пользователю.