ВВЕРХ
ВНИЗ

Определяем цвет точки с помощью GetPixel

Рассмотрим функцию GetPixel(x,y) в паскале – очень важную в графике Паскаля подпрограмму для работы с точками (пикселями). На странице Точки в Паскале. SetPixel и PutPixel мы занимались тем, что окрашивали точки в графическом окне PascalABC.Net разными цветами, а потом из отдельных пикселей изобразили геометрические фигуры – точки, линии, прямоугольники, круг и эллипс. То есть задача состояла в том, чтобы круг, например, закрасить в наперед заданный цвет – с помощью функции SetPixel или GetPixel.

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

GetPixel(x, y)возвращает цвет точки с координатами (x,y)

Чтобы продемонстрировать на примере использование данной функции, напишем простую программу, в которой нарисуем три закрашенных случайным цветом круга. После этого нарисуем ещё и прямоугольник, который будет закрашенный в такой же цвет, как и 1-й круг.

Первый круг и прямоугольник одного цвета в Pascal

Код PascalABC.Net, PascalABC
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
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.

Запустим эту программу в 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.Net
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
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.

А вот, чтобы программа заработала на простом PascalABC, необходимо немногое изменить: добавить модуль событий Events, изменить тип переменной с на integer в процедуре MouseDown, а вместо преобразования цвета в строку типа red.ToString (через классы) использовать стандартное IntToStr(red):

Код PascalABC
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
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.

Программа работает так: сначала мы вызываем процедуру 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 для красного, зеленого и синего). Убедитесь, что цвет прямоугольника всегда совпадает с цветом нажатой точки над курсором мыши.

Определяем цвет пикселя на изображении в Pascal


Вот такая она подпрограмма GetPixel(x, y)функция, возвращающая цвет точки с координатами (x, y).


Яндекс.Метрика