Определяем цвет точки с помощью GetPixel
Рассмотрим функцию GetPixel(x,y) в паскале – очень важную в графике Паскаля подпрограмму для работы с точками (пикселями). На странице Точки в Паскале. SetPixel и PutPixel мы занимались тем, что окрашивали точки в графическом окне PascalABC.Net разными цветами, а потом из отдельных пикселей изобразили геометрические фигуры – точки, линии, прямоугольники, круг и эллипс. То есть задача состояла в том, чтобы круг, например, закрасить в наперед заданный цвет – с помощью функции SetPixel или GetPixel.
Сейчас задача стоит обратная: дано некую фигуру (или точку), надо определить цвет, в который она окрашена. Делается это с помощью функции GetPixel.
✎ GetPixel(x, y) – возвращает цвет точки с координатами (x,y)
Чтобы продемонстрировать на примере использование данной функции, напишем простую программу, в которой нарисуем три закрашенных случайным цветом круга. После этого нарисуем ещё и прямоугольник, который будет закрашенный в такой же цвет, как и 1-й круг.
|
Запустим эту программу в PascalABC.Net и увидим, что получилось. Сначала мы закрашиваем первый круг случайным цветом, потом второй и третий. Для задания цвета круга используем процедуру SetBrushColor(...), которая задает кисти определенный цвет и всегда используется для закрашивания фона или некоторой области.
Итак, после того как мы нарисовали три закрашенных разноцветных круга (строки 6 – 13), идет сообщение о том, что цвет следующего прямоугольника равен цвету первого круга (строка 19). Первый оператор – SetBrushColor(clWhite)
(строка 16), – говорит о том, что сообщение будет записываться в прямоугольник белого цвета. Второй оператор – SetFontColor(clRed)
(строка 17) – закрашивает сообщение в красный цвет (Font – шрифт, Color – цвет). Оператор SetFontSize(12)
(строка 18) – размер шрифта равен 12 (Size – размер). И, собственно, само сообщение выводится в прямоугольник с координатами левого верхнего угла (80, 220) с помощью оператора TextOut(80, 220, 'Цвет прямоугольника = цвет первого круга:')
(строка 19).
Наконец, в третьей части программы рисуем прямоугольник, предварительно установив цвет кисти: SetBrushColor(GetPixel(100, 100))
(строка 22) – определяем цвет точки с координатами (100, 100). Вместо точки (100, 100) – центра 1-го круга – можно было взять другую точку того же круга, например (110, 90), или точку с координатами (x, y), удовлетворяющими неравенству (x - 100)2 + (y - 100)2 < 702 – условие попадания точки (x, y) в круг радиуса 70 с центром (100, 100).
Как видим, в результате мы получаем три разноцветных круга и один прямоугольник, цвет которого совпадает с цветом первого круга. А все из-за того, что мы определили цвет первой фигуры с помощью функции GetPixel(x, y) в паскале, не смотря на то, что цвет круга был случайным.
Пипетка: определение цвета точки на рисунке
А теперь рассмотрим более интересный пример с использованием GetPixel(x, y), показывающий, по какому принципу работает функция «пипетка» в графических программах типа Photoshop, Gimp, Paint.Net или им подобных (платных и бесплатных). Для этого нам понадобится создать какой-то рисунок, а потом нажатием на рисунке левой кнопки мыши по какой-либо точке определить её цвет с помощью функции GetPixel(x, y).
Итак, этого нам понадобится реализовать две подпрограммы: первая будет создавать рисунок (процедура drawing), а вторая – закрашивать небольшой прямоугольник цветом, совпадающим с цветом точки при нажатии на нее мышкой (процедура MouseDown). Сначала запишем саму программу на PascalABC.Net (на простом PascalABC работать не будет, см. ниже):
|
А вот, чтобы программа заработала на простом PascalABC, необходимо немногое изменить: добавить модуль событий Events, изменить тип переменной с
на integer
в процедуре MouseDown, а вместо преобразования цвета в строку типа red.ToString (через классы) использовать стандартное IntToStr(red)
:
|
Программа работает так: сначала мы вызываем процедуру drawing, которая создает изображение с помощью встроенной подпрограммы, работающей с пикселями – SetPixel(x, y, c), – где каждой точке с прямоугольника [0, 255]х[0, 255] присваивается определенный цвет. Потом при нажатии на мышку срабатывает процедура OnMouseDown – событие нажатия на кнопку мыши, работающая, кстати, как функция (поэтому ей можно присвоить другую процедуру). Эта процедура имеет три параметра: x, y – координаты точки в момент нажатия на нее мышкой, и параметр mousebutton. Если нажата левая кнопка мышки, то mousebutton = 1, если правая, то mousebutton = 2.
Таким образом, при нажатии на кнопку мыши вызывается процедура MouseDown, в которой производятся вычисления только при нажатии на левую кнопку (mb = 1). Действия просты: сначала GetPixel(x, y) считывает координаты нажатой точки и определяет её цвет, а потом MouseDown закрашивает прямоугольник справа этим цветом, а также делает надписи – количество красного, зеленого и синего цвета в данном цвете (числа от 0 до 255).
Если вы ещё не запустили программу в PascalABC.Net или PascalABC, то запустите и поэкспериментируйте. Каждый раз при нажатии на какую-либо точку прямоугольник справа будет перекрашиваться в соответствующий цвет. Попробуйте нажать на изображение, а потом на белое пространство (белый цвет – это 255 для красного, зеленого и синего). Убедитесь, что цвет прямоугольника всегда совпадает с цветом нажатой точки над курсором мыши.
Вот такая она подпрограмма GetPixel(x, y) – функция, возвращающая цвет точки с координатами (x, y).