Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Эффект Colorize


Автор: SandyProgrammer 27.4.2008, 13:32
Здравствуйте, уважаемые Программисты!
В общем есть у меня такой вопрос. Есть у меня на форме картинка, хотелось бы применить к ней эффект, который называется colorize. То есть делать картинку однотонной. Но как это реализовать, я не знаю.
Нашёл в DRKB вот такой код:
Код

function Colorize(RGB, Luma: Cardinal);
var
l, r, g, b: Single;
begin
Result := Luma;
if Luma = 0 then { it's all black anyway}
   Exit;
l := Luma / 255;
r := RGB and $FF * l;
g := RGB shr 8 and $FF * l;
b := RGB shr 16 and $FF * l;
Result := Round(b) shl 16 or Round(g) shl 8 or Round(r);
end;

Но этот код для меня сложен, я не знаю, как его использовать. В общем, помогите пожалуйста в этом вопросе.

Пример эффекта colorize (на случай, если я коряво описал):
http://radikal.ru/F/i016.radikal.ru/0804/82/392215f8f50c.jpg.html

Автор: THandle 27.4.2008, 13:55
Что это за функция без результата? smile 
Код

 function Colorize(RGB, Luma: Cardinal);


?

И собственно говоря что конкретно не понятно в этом коде?

Автор: mr.Anderson 27.4.2008, 14:09
Алгоритм этого эффекта тоже не знаю, но можно попробовать его понять.

Luma - это, как я понял, сила окрашивания. Она применяется в следующих формулах для задания смещения цвета в определенную сторону. 
Ведь что такое Colorize, судя по картинкам? Это смещение общего цветового баланса в определенную сторону. Поэтому сначала определяем силу, затем по каждой из трех составляющих цвета (Red, Green, Blue, RGB) производим смещение цвета с заданной силой. Про shr и shl ничего не могу сказать, похоже, это просто надо запомнить. В G и B происходит смещение через shr, а вот в результате производится обратное смещение с помощью shl, применяемое уже к новому цвету, полученному ранее. Не могу сказать, зачем это нужно. Я бы просто запомнил. Хотя и объяснение получить тоже интересно.

Не знаю, понятно ли объяснил и правильно ли. Но мне кажется, что так. smile

Автор: VICTAR 27.4.2008, 14:20
оно?

Автор: SandyProgrammer 27.4.2008, 14:29
VICTAR, оно! Очень здорово.  smile 
А можно сделать так, чтобы как в фотошопе было? Ну например мы двигаем TrackBar и в зависимости от положения меняется цвет картинки? Сам я не додумаюсь как такое сделать... :(

Хотя нет! Додумаюсь, если посидеть, подумать. Но от готового примерчика не откажусь. smile

Автор: VICTAR 27.4.2008, 14:43
У меня сейчас не стоит фотошопа.
Если у тебя не получится, то поставлю фотошоп, посмотрю как там сделано... 

Автор: SandyProgrammer 27.4.2008, 14:44
VICTAR, окей! Спасибо, Вам большое.

Автор: SandyProgrammer 27.4.2008, 15:02
Так, ну вот я набросал, как оно должно выглядеть на основе Вашего VICTAR примера.
Только у меня изображение меняется по одному из трёх каналов, а мне нужно чтобы по всем цветам сразу. И ещё результат мне хотелось бы не на отдельном Image выводить, а на том же самом.

Вот небольшое видео - пример как это реализовано в Photoshop:
http://ifolder.ru/6327178 (709 kb)

Мне нужно, чтобы так же ползунком (TrackBar например) можно было этот эффект воспроизводить.

Автор: SandyProgrammer 29.4.2008, 11:20
Что-то у меня у самого не получается сделать полноценный эффект colorize.  smile  Помогите кто-нибудь, пожалуйста. Все данные в предыдущем посте...

Автор: SandyProgrammer 29.4.2008, 22:11
Вот, сделал какое-то подобие эффекта colorize. Мне для использования в своём проекте хватит, но если кто-то доведёт это дело до ума, буду рад.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)