Getpixel визначаємо колір точки, як працює піпетка

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

Зараз завдання стоїть зворотна: дано якусь фігуру (або точку), треба визначити колір, в який вона пофарбована. Робиться це за допомогою функції GetPixel.

✎ GetPixel (x, y) - повертає колір точки з координатами (x, y)

Щоб продемонструвати на прикладі використання даної функції, напишемо просту програму, в якій намалюємо три зафарбованих випадковим кольором кола. Після цього намалюємо ще й прямокутник, який буде зафарбований в такий же колір, як і 1-й коло.

Getpixel визначаємо колір точки, як працює піпетка

Код PascalABC.Net, PascalABC

Запустимо цю програму в 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 <70 2 – условие попадания точки (x, y) в круг радиуса 70 с центром (100, 100).

Як бачимо, в результаті ми отримуємо три різнокольорових кола і один прямокутник, колір якого збігається з кольором першого кола. А все через те, що ми визначили колір першої фігури за допомогою функції GetPixel (x, y) в Паскалі, не дивлячись на те, що колір кола був випадковим.

Піпетка: визначення кольору точки на малюнку

А тепер розглянемо більш цікавий приклад з використанням GetPixel (x, y), що показує, за яким принципом працює функція «піпетка» в графічних програмах типу Photoshop, Gimp, Paint.Net або їм подібних (платних і безкоштовних). Для цього нам знадобиться створити якийсь малюнок, а потім натисканням на малюнку лівої кнопки миші по будь-якій точці визначити її колір за допомогою функції GetPixel (x, y).

Отже, цього нам знадобиться реалізувати дві підпрограми: перша буде створювати малюнок (процедура drawing), а друга - зафарбовувати невеликий прямокутник кольором, що збігається з кольором точки при натисканні на неї мишкою (процедура MouseDown). Спочатку запишемо саму програму на PascalABC.Net (на простому PascalABC працювати не буде, див. Нижче):

Програма працює так: спочатку ми викликаємо процедуру 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 визначаємо колір точки, як працює піпетка

Ось така вона підпрограма GetPixel (x, y) - функція, яка повертає колір точки з координатами (x, y).

div> .uk-panel '> "data-uk-grid-margin>