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

от автора

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

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

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

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

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

Для написания программы выбрал свободную среду Lazarus. Так как по умолчанию Lazarus не понимает большинства форматов изображений, проект был дополнен свободной библиотекой BGRABitmap.

После нажатия кнопки с фильтром запускается алгоритм, который делает тоже самое, что и функция Curves в Photoshop и Gimp.

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

// 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;    

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

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

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

Архив залил на Google диск. Для скачивания нужно выбрать в меню «Файл — Скачать» или нажать Ctrl+S. После запуска исполняемого файла и загрузки изображения, появятся четыре картинки, которые демонстрируют работу фильтров. Для применения одного из них нужно нажать кнопку под картинкой. В окне программы минимум управляющих элементов, я надеюсь все интуитивно понятно.

Зачем это нужно?

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

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


Комментарии

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

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