Реализация цветофильтров в стиле Instagram с помошью аматорской программы

от автора

В данном посте я расскажу как написать простую программу, реализующую фотофильтры. В конце текста ссылка на zip-архив с готовой версией.

Волшебные фильтры, придающие фотографиям ностальгические нотки, покорили миллионы людей, в том числе и меня.

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

Большинство фильтров Instagram включают сложную цепочку операций поэлементного изменения цвета. В первом приближении, некоторые эффекты можно моделировать с помощью ‘кривых’.

Кривые — представляют собой таблицу значений красного, зеленого и синего цвета исходного и результирующего изображений. В растровых редакторах данную функцию представляют в виде графика, который можно сохранить в файл. Некоторые программы например Gimp, создают обычный текстовый файл. Его можно открыть в своей программе, с помощью стандартных текстовых функций.

Алгоритм изменения цвета кривыми реализуется очень легко. Каждому пикселю, исходной картинки присваивается новый цвет, согласно табличной функции.

// Zurbaganin // 2013  //Для работы с различными форматами изображений используется библиотека BGRABitmap  function cuver_apply(number:integer;myPict:TBGRABitmap): TBGRABitmap;  var x,y: integer;     p: PBGRAPixel;     Tp:TBGRAPixel;      Tp1,Tp2:TBGRAPixel;     r,g,b,v:byte;  //arr1[0..3,0..255 ] - массив значений цвета, прочитанный из файла <кривых>     begin    for y := 0 to myPict.Height-1 do   begin     p := myPict.Scanline[y];       for x := 0 to myPict.Width-1 do     begin          r:=Round(255*arr1[1,p^.red]);          g:=Round(255*arr1[2,p^.green]);          b:=Round(255*arr1[3,p^.blue]);            r:=Round(255*arr1[0,r]);           g:=Round(255*arr1[0,g]);           b:=Round(255*arr1[0,b]);          Tp.red:=r;         Tp.green:=g;         Tp.blue:=b;         p^:= Tp;         inc(p);     end;   end;   myPict.InvalidateBitmap;   Result:=myPict;  end;    

Я подобрал несколько файлов и использовал их, для создания нескольких эффектов.
Настройки (кривые) подбирались основываясь на кадрах из фильмов (Аватар, Пираты Карибского моря) и некоторых фотографий.

Вот как будет выглядеть знаменитый персонаж после обработки фильтрами.

Архив с программой

ссылка на оригинал статьи http://habrahabr.ru/post/172823/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *