Разбор кода фоторедактора.
{ получаем из значения цвета ее состовляющие RGB и яркость }
procedure getColorInfo(color_:dword <-4х байтный цвет);
var r,g,b:byte; w,h:integer;rec:trect;
begin
with form1 do begin <- это сокрашение кода что бы не писать вот так form1.edit2.text:=''
получаем красный зеленый и голубой состовляющие нашего цвета
r:=getrvalue(color_);
g:=getgvalue(color_);
b:=getbvalue(color_);
edit2.Text:=inttohex(color_,4); здесь у нас преобразуется из вида 234 в 23fba
выводим результат
label2.caption:='R: '+inttostr(r)+
' '+'G: '+inttostr(g)+
' '+'B: '+inttostr(b);
image2.Transparent:=true; это прозрачность фото, что бы не было белого фона
image2.Canvas.Pen.Color:=color_; здесь мы устанавливаем цвет карандаша
image2.Canvas.Brush.Color:=color_; а здесь цвет кисти
{ покажем захваченного курсором цвет пикселя }
for w:=1 to image2.Width do
for h:=1 to image2.Height do
image2.Canvas.Pixels[w,h]:=color_; образец цвета
end;
end;
Надеюсь тут более менее понятно
На счет 4х байтного цвета что это такое? Имеем несколько целочисленных типов переменных это
byte,word,dword байт-это переменная хранящая от 0 до 255 разрядов (в hex виде 0..FF) короче если в переменную
intB : Byte; intB:=32768; записать 32768 то это вызовет ошибку компилятора так как в 255 нельзя запихнуть большее число.
Word- слово это два байта, 02 03 а dword следовательно 4 байта 02 03 04 05.
Теперь по поводу вот этого не понятного кода
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
getcolorInfo(image1.Canvas.Pixels[x,y]);
Во-первых старайтесь неизвестный код расшифровывать с английского на русский
Tform это форма окно нашей программы image1 это компонент для работы с фото mouse -мышь move движение,движение мыши т.е курсора. Стоит немного затронуть тему событий в делфи.
События это то что происходит с компонентами на форме,и даже с формой. При нажатии на кнопку происходит
ее включение или выключение вот это и есть событие. Нажатие кнопки мыши тоже событие, перемещение курсора тоже событие, двойной щелчок мыши - событие. Событие - это производимые действия, в компоненте фото есть события загрузки фото, форма может тоже получать события это изменение ее размеров,перемещение всего окна ит.д.
И вот перед нами обработчик этого события перемещения мыши :)
С виду это обычная процедура но с нестандартными переменными (типами данных)
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
Если зажать Ctrl+щелчок мыши по типу переменной то мы попадем в тот модуль в котором этот тип данных описан
полезно пользоваться этой возможность и дойти до самого конца и выяснить что это за тип данных, попробуйте сделать это. Не будем затрагивать вот эти переменные Sender: TObject; Shift: TShiftState; а возьмем х и у это конечно же
как можно догадаться координаты курсора мыщи. Скажу что у нас ось у уходит из левого верхнего угла экрана от 0 до 255 нижний левый угол, а ось х естественно начинается в левом верхнем углу экрана и заканчивается 255 в верхнем правом углу, т.е у нас перевернутая система координат.
Да чуть не забыл в инспекторе объектов есть вторая вкладка которая и отображает события Events имеющиеся в данном компоненте (конечно необходимо выделить компонент что бы увидеть его события).
Слева мы видим названия событий а справа обработчик события ( мы его должны сами написать, делфи только создает заголовок процедуры на автомате) вот там и щелкнем дважды и попадем в редактор кода.
Первая вкладка Properties это свойства компонента слева их названия справа их значения. Свойства это те параметры которые мы можем настроить изменить текст на компоненте,цвет,высоту и ширину, прозрачность (если она имеется) расположение на форме (выравнивание).
Вот взляните на инспектор объектов:
С учетом новых знаний разберем эту процедуру обработчик-события
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
getcolorInfo(image1.Canvas.Pixels[x,y]); мы указываем в качестве индексов массива пикселов фото (канва это холст для рисования ) координаты курсора
label1.Caption:='Яркость: '+inttostr(getbrightness(image1.Canvas.Pixels[x,y]));
используем фу-ию getbrightness для получения яркости, извини забыл привести код данной фу-ии вот он
фу-ия берет в качестве входного аргумента цвет-число а на выходе тоже число-яркость
function GetBrightness(Clr : Integer):Integer;
begin
result это зарезервированное слово используемое для вывода результата
фу-ия round это обычное округление в данном случае мы просто умножаем цветоразностные сигналы на константы
они взяты к примеру за стандарт в телевидении и реализованы в каждом старом телевизоре, только не на программном уровне а на электронном электроника рулит )))
Result := Round(0.3*GetRValue(Clr)+0.59*GetGValue(Clr)+0.11*GetBValue(Clr));
end;
Только не забудьте разместить этот код выше того места где он используется иначе будет ошибка. Сперва описуем фу-ию, процедуру а потом ниже по коду используем.
это лишний код не имеющий к делу отношения.
if (startx<>0) and (starty<>0) then begin
image1.Canvas.Pen.Style:=psdot;
image1.Canvas.Rectangle(startx,starty,x,y);
end;
end;
Теперь по поводу принципа работы, в большинстве случаев нам прийдется делать вычисления над яркостью всех пикселов фото (или выделенных) .
Повышение яркости это сложение значения яркости с некоторым фиксированным значением в пределах от 0 до 255.
Снижение яркости это вычитание из яркости какой то константы. С контрастом немного по другому но опять же теже математические действия. К примеру что бы получить негатив фото необходимо от каждой яркости каждого пиксела отнять 255 т.е наоборот y:=255-y.
Дальше еше больше это возможность применения различных фильтров которые имеются в фотошопе и в других редакторах, сглаживающий фильтр (размытие по гаусу) например может быть реализован вот так процетирую:
"Находится среднее арифметическое значение всех элементов изображения(пикселов), после чего это среднее значение становится значением среднего элемента".
Комментариев нет:
Отправить комментарий