Рассмотрим функцию GetPixel(x,y) в паскале – очень важную в графике Паскаля подпрограмму для работы с точками (пикселями). На странице Точки в Паскале. SetPixel и PutPixel мы занимались тем, что окрашивали точки в графическом окне PascalABC.Net разными цветами, а потом из отдельных пикселей изобразили геометрические фигуры – точки, линии, прямоугольники, круг и эллипс. То есть задача состояла в том, чтобы круг, например, закрасить в наперед заданный цвет – с помощью функции SetPixel или GetPixel.
Сейчас задача стоит обратная: дано некую фигуру (или точку), надо определить цвет, в который она окрашена. Делается это с помощью функции GetPixel.
✎ GetPixel(x, y) – возвращает цвет точки с координатами (x,y)
Чтобы продемонстрировать на примере использование данной функции, напишем простую программу, в которой нарисуем три закрашенных случайным цветом круга. После этого нарисуем ещё и прямоугольник, который будет закрашенный в такой же цвет, как и 1-й круг.
uses
GraphABC;
begin
{ Закрашиваем 1-й круг случайным цветом: }
SetBrushColor(clRandom); //присваиваем кисти случайный цвет
Circle(100, 100, 70);//круг с центром (100,100) рариусом 70
{ Закрашиваем 2-й круг случайным цветом: }
SetBrushColor(clRandom); //присваиваем кисти случайный цвет
Circle(250, 100, 70);//круг с центром (250,100) рариусом 70
{ Закрашиваем 3-й круг случайным цветом: }
SetBrushColor(clRandom); //присваиваем кисти случайный цвет
Circle(400, 100, 70);//круг с центром (250,100) рариусом 70
{ Выводим сообщение: }
SetBrushColor(clWhite); //цвет фона сообщения - белый
SetFontColor(clRed); //цвет сообщения - красный
SetFontSize(12); //размер сообщения = 12
TextOut(80, 220, 'Цвет прямоугольника = цвет первого круга:');
{ Закрашиваем прямоугольник в цвет первого круга: }
SetBrushColor(GetPixel(100, 100)); //цвет центра 1-го круга
FillRect(150, 250, 400, 350) //заполняем прямоугольник
end.
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
Запустим эту программу в 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 работать не будет, см. ниже):
uses
GraphABC;
var
red, green, blue: integer;
S: string;
{ Процедура вызывается при нажатии мышкой в графическом окне: }
procedure MouseDown(x, y, mb: integer);
begin
if mb = 1 then begin { <== Срабатывает при нажатии левой кнопки мыши }
{ Перекрашиваем надпись в белый цвет: }
SetFontColor(clWhite);
TextOut(420, 20, red.ToString);
TextOut(420, 50, green.ToString);
TextOut(420, 80, blue.ToString);
{ Закрашиваем прямоугольник в цвет c: }
var c := GetPixel(x, y); //возвращаем цвет точки (x, y)
SetBrushColor(c); //цвет кисти
FillRect(300, 20, 400, 100); //рисуем прямоугольник
{ Определяем красную, зеленую и синюю составляющие: }
red := GetRed(c); //возвращаем красную составляющую цвета
green := GetGreen(c); //возвращаем зеленую составляющую цвета
blue := GetBlue(c); //возвращаем синюю составляющую цвета
{ Сообщение о возвращенном цвете: }
SetBrushColor(clWhite); //цвет кисти - белый
//выводим красную составляющую цвета
SetFontColor(clRed); //цвет шрифта - красный
TextOut(420, 20, red.ToString);
//выводим зеленую составляющую цвета
SetFontColor(clGreen); //цвет шрифта - зеленый
TextOut(420, 50, green.ToString);
//выводим синюю составляющую цвета
SetFontColor(clBlue); //цвет шрифта - синий
TextOut(420, 80, blue.ToString)
end
end;
{ Процедура создания рисунка: }
procedure drawing;
begin
for var i := 0 to 255 do
for var j := 0 to 255 do begin
var r : byte := i;
var g : byte := j;
var b : byte := i + j;
SetPixel(i, j, RGB(r, g, b))
end
end;
{ ОСНОВНАЯ ПРОГРАММА: }
begin
drawing; //вызываем процедуру создания рисунка
OnMouseDown := MouseDown //вызываем процедуру при нажатии мыши
end.
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
А вот, чтобы программа заработала на простом PascalABC, необходимо немногое изменить: добавить модуль событий Events, изменить тип переменной
с
наinteger
в процедуре MouseDown, а вместо преобразования цвета в строку типа red.ToString (через классы) использовать стандартноеIntToStr(red)
:
uses
GraphABC, Events;
var
red, green, blue: integer;
S: string;
procedure MouseDown(x, y, mb: integer);
var
c: integer;
begin
if mb = 1 then begin
{ Перекрашиваем надпись в белый цвет: }
SetFontColor(clWhite);
TextOut(420, 20, IntToStr(red));
TextOut(420, 50, IntToStr(green));
TextOut(420, 80, IntToStr(blue));
{ закрашиваем прямоугольник в цвет c: }
c := GetPixel(x, y); //возвращаем цвет точки (x, y)
SetBrushColor(c); //цвет кисти
FillRect(300, 20, 400, 100); //рисуем прямоугольник
{ Определяем красную, зеленую и синюю составляющие: }
red := GetRed(c); //возвращаем красную составляющую цвета
green := GetGreen(c); //возвращаем зеленую составляющую цвета
blue := GetBlue(c); //возвращаем синюю составляющую цвета
{ Сообщение о возвращенном цвете: }
SetBrushColor(clWhite); //цвет кисти - белый
//выводим красную составляющую цвета
SetFontColor(clRed); //цвет шрифта - красный
TextOut(420, 20, IntToStr(red));
//выводим зеленую составляющую цвета
SetFontColor(clGreen); //цвет шрифта - зеленый
TextOut(420, 50, IntToStr(green));
//выводим синюю составляющую цвета
SetFontColor(clBlue); //цвет шрифта - синий
TextOut(420, 80, IntToStr(blue))
end
end;
procedure drawing;
var
i, j, r, g, b: integer;
begin
for i := 0 to 255 do
for j := 0 to 255 do begin
r := i;
g := j;
b := i + j;
SetPixel(i, j, RGB(r, g, b))
end
end;
begin
drawing; //вызываем процедуру создания рисунка
OnMouseDown := MouseDown //вызываем процедуру при нажатии мыши
end.
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне
Программа работает так: сначала мы вызываем процедуру 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).