Эффект сепии

altСегодня я покажу вам как без особого труда Наложить на изображение эффект сепии. Как обычно, язык программирования — Delphi.

Немного теории…

Сам по себе данный эффект не сложный. Сепия, в переводе с английского, означает краску ярко-коричневого оттенка. Посмотрим пример изображения с применённым эффектом сепии:

Как видно из примера, данный эффект выглядит очень интересно и при грамотном применении может улучшить дизайн фотографий.

От теории к практике…

Итак, теперь о том, как будем достигать данного эффекта. Для этого достаточно слегка подкорректировать цветовые каналы изображения… Распишу по шагам:

Для точки изображения вычисляем усреднённый цвет на основе составляющих gray=(R+G+B)/3;
Введём параметр глубины (depth) эффекта, чем выше глубина, тем сильнее будет эффект;
Вычисляем новое значение красного канала для точки: R=gray+(depth*2);
Вычисляем значение зелёного канала для точки: G=gray+depth;
Значение синего канала для точки будет равно усреднённому значению B=gray.
Как видно из описания, ничего сложного в данном алгоритме нет. Теперь перейдём к коду.

Только кодкопировать в буфер обменапечать
procedure SepiaBitmap(bmp: TBitmap; depth: Integer);
type
TRGBTripleArray = array[0..32767] of TRGBTriple;
PRGBTripleArray = ^TRGBTripleArray;
var
i,j, rr, gg: Integer;
line: PRGBTripleArray;
gray: Byte;
begin
bmp.PixelFormat:=pf24bit;
for i := 0 to bmp.Height-1 do
begin
line:=pRGBTripleArray(bmp.ScanLine[i]);
for j := 0 to bmp.Width — 1 do
begin
gray:=(line[j].rgbtRed+line[j].rgbtGreen+line[j].rgbtBlue) div 3;
rr:=gray+(depth*2);
gg:=gray+depth;
if rr > 255 then
rr:=255;
if gg > 255 then
gg:=255;
line[j].rgbtRed:=rr;
line[j].rgbtGreen:=gg;
line[j].rgbtBlue:=gray;
end;
end;
end;
Данная процедура реализует вышеописанный алгоритм.

Понравилась статья? Поделиться с друзьями: