Эффект выборочного цвета на PHP
Эффект выборочного цвета на PHP
Эффект выборочного цвета есть в некоторых фотоаппаратах Nikon, во многих графических редакторах. Сам эффект заключается в том, что на изображении цветным остается только какой-нибудь один тон, а все остальные цвета преобразуются в оттенки серого. Выборочный цвет, например, часто применяется в оформлении готических фотографий, на которых кроваво-красные цветы, элементы одежды или предметы сочетаются с мрачным черно-белым фоном.
Выборочный цвет - красный
Я решил реализовать подобный эффект на PHP. Алгоритм обработки простой: в цикле проходим по всем точкам изображения, если точка попадает в нужный цветовой тон, то она остается без изменения, иначе обесцвечивается. Обрабатывать изображение попиксельно мы умеем, определять цвета точек тоже. Основной код позаимствован из предыдущей статьи, оттуда же взята формула получения значения цветового тона из RGB-цвета.
Code (PHP) : Убрать нумерацию
- // Файл для обработки
- $im=ImageCreateFromJPEG('test.jpg');
- // Размеры изображения
- $width=ImageSX($im);
- $height=ImageSY($im);
- for ($x=0; $x<$width; $x++) {
- for ($y=0; $y<$height; $y++) {
- $rgb=ImageColorAt($im,$x,$y);
- $R=($rgb >> 16) & 0xFF;
- $G=($rgb >> 8) & 0xFF;
- $B=$rgb & 0xFF;
- // Цветовой тон
- $maxRGB=max(array($R, $G, $B));
- $minRGB=min(array($R, $G, $B));
- $delta=$maxRGB-$minRGB;
- if ($delta!=0) {
- if ($maxRGB==$R) {
- $h=(($G-$B)/$delta);
- }
- elseif ($maxRGB==$G) {
- $h=2+($B-$R)/$delta;
- }
- elseif ($maxRGB==$B) {
- $h=4+($R-$G)/$delta;
- }
- $hue=round($h*60);
- if ($hue<0) { $hue+=360; }
- }
- else {
- $hue=0;
- }
- // Оставить только красный цветовой тон
- if (!($hue>320 || $hue<=20)) {
- // Преобразовать цвет в оттенки серого
- $gray=0.2126*$R+0.7152*$G+0.0722*$B;
- $new_color=ImageColorAllocate($im, $gray, $gray, $gray);
- ImageSetPixel($im,$x,$y,$new_color);
- }
- }
- }
- // Прибраться за собой
- ImageDestroy($im);
Gray = 0.2126*R + 0.7152*G + 0.0722*B
Соответственно, при обесцвечивании точки изображения, каждая составляющая RGB исходного цвета получает одинаковые значения, равные значениям оттенков серого.
Вот несколько примеров фотографий с наложенным на них эффектом выборочного цвета. Все они были получены только при помощи этого скрипта, никакие графические редакторы при этом не использовались.
Исходное изображение
Выборочный цвет - красный
Выборочный цвет - зеленый
Исходное изображение
Выборочный цвет - синий
Выборочный цвет - желтый
Этот же код можно использовать просто для преобразования изображения в оттенки серого. Для этого надо убрать вычисление цветового тона и проверку его граничных значений.
Code (PHP) : Убрать нумерацию
- $file='test.jpg';
- $im=ImageCreateFromJPEG($file);
- $width=ImageSX($im);
- $height=ImageSY($im);
- for ($x=0; $x<$width; $x++) {
- for ($y=0; $y<$height; $y++) {
- $rgb=ImageColorAt($im,$x,$y);
- $R=($rgb >> 16) & 0xFF;
- $G=($rgb >> 8) & 0xFF;
- $B=$rgb & 0xFF;
- $gray=0.2126*$R+0.7152*$G+0.0722*$B;
- $new_color=imagecolorallocate($im, $gray, $gray, $gray);
- imagesetpixel($im,$x,$y,$new_color);
- }
- }
- header("Content-type: image/jpeg");
- ImageJPEG($im,NULL,100);
- // Прибраться за собой
- ImageDestroy($im);
Изображение в оттенках серого
Еще один вариант этого эффекта - "рентгеновский снимок". Тут тоже считается оттенок серого, но немного по другой формуле, а затем цвет инвертируется.
Code (PHP) : Убрать нумерацию
- $file='test.jpg';
- $im=ImageCreateFromJPEG($file);
- $width=ImageSX($im);
- $height=ImageSY($im);
- for ($x=0; $x<$width; $x++) {
- for ($y=0; $y<$height; $y++) {
- $rgb=ImageColorAt($im,$x,$y);
- $R=($rgb >> 16) & 0xFF;
- $G=($rgb >> 8) & 0xFF;
- $B=$rgb & 0xFF;
- $gray=0.3*$R+0.6*$G+0.1*$B;
- $gray=280-$gray;
- if ($gray>255) { $gray=255; }
- $new_color=imagecolorallocate($im, $gray, $gray, $gray);
- imagesetpixel($im,$x,$y,$new_color);
- }
- }
- header("Content-type: image/jpeg");
- ImageJPEG($im,NULL,100);
- // Прибраться за собой
- ImageDestroy($im);
Эффект рентгеновского снимка
А вот программная реализация алгоритма из статьи. При помощи этой утилиты можно удалять с изображения ненужные цвета. Автор - wetal, за что ему большое спасибо.
Просмотров: 2884 | Комментариев: 14
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(12.04.2022 в 11:04):
Добавил эффекты оттенков серого и рентгеновских лучей.
Never
(27.07.2016 в 15:52):
wetal, спасибо!
voffka
(20.07.2016 в 06:40):
Теперь понятно как на али семена рисуют
master-ufa
(19.07.2016 в 17:21):
Спасибо. То, что доктор прописал.
DiPrm
(19.07.2016 в 09:39):
Красивая реализация на PHP и отличная программа! От себя добавлю, что интересный эффект дает закрашивание фона в черный цвет помимо оттенок серого, можно также добавить прозрачность.
ManHunter
(18.07.2016 в 11:02):
Прикольно получилось, спасибо! Прицеплю к статье в качестве примера.
wetal
(18.07.2016 в 10:43):
Вот, посмотрите что вышло:
win2util.far.ru/programs/remcol.zip
После запуска программы выбираем изображение( положил в архив два с разными цветами!), оно открывается в уменьшенном размере. если умещается не всё в окне, то можно окно программы растянуть.
Галочками отмечаем, какой цвет оставить и нажимаем Просмотр, для возврата всех цветов нажимаем Сброс. Правой кнопкой мыши можно на картинке выбрать цвет, который надо удалить с картинки, если даже он входит в диапазон выбранных цветов. Это бывает полезно для коррекции.
Вроде всё остальное понятно. Проверял на win XP.
win2util.far.ru/programs/remcol.zip
После запуска программы выбираем изображение( положил в архив два с разными цветами!), оно открывается в уменьшенном размере. если умещается не всё в окне, то можно окно программы растянуть.
Галочками отмечаем, какой цвет оставить и нажимаем Просмотр, для возврата всех цветов нажимаем Сброс. Правой кнопкой мыши можно на картинке выбрать цвет, который надо удалить с картинки, если даже он входит в диапазон выбранных цветов. Это бывает полезно для коррекции.
Вроде всё остальное понятно. Проверял на win XP.
ManHunter
(17.07.2016 в 20:13):
А лучше на файлообменник, тогда я приаттачу программу к статье.
master-ufa
(17.07.2016 в 19:16):
wetal пришли на электронку: 771973@mail.ru
wetal
(15.07.2016 в 18:04):
master-ufa, можно легко! Я почти так и сделал "на коленке" тестовую. Могу оформить в конечный вариант, если надо.
Never
(15.07.2016 в 13:04):
Ох не фигаж ты демон! Фотошоп фотошопом, а тут же хоть пакетную обработку фигач. Да и не всегда же комбайн в виде фотошопа нужен, я до сих пор твоими "пилотами" пользуюсь.
ManHunter
(15.07.2016 в 11:01):
master-ufa, фотошоп же: http://photoshop-help.ru/3061-...yy-urok.html
master-ufa
(15.07.2016 в 10:25):
А можно сделать программку, где в одном окне файл находишь, а в другом определяешь какие цветы оставить/убрать?
wetal
(15.07.2016 в 06:18):
Спасибо, очень полезный алгоритм. Предыдущую статью "Определение основного цвета изображения на PHP" видел, но как то тогда не увидел практической ценности( на PHP не пишу). А тут с наглядными примерами сразу стало ясно где и как можно применить. Переписал для себя, отлично работает и на десктопе, достаточно быстро фильтрует цвета!
Добавить комментарий
Заполните форму для добавления комментария