Blog. Just Blog

Эффект пикселизации на PHP

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Эффект пикселизации на PHP
Эффект пикселизации на PHP

Очередная реализация графических эффектов на PHP. На этот раз будет эффект пикселизации. Он заключается в следующем: изображение делится на квадраты (блоки) нужного размера, в каждом из них определяется основной цвет, затем выполняется заливка квадрата полностью этим цветом. Да, я в курсе про существование штатной функции PHP imagefilter с параметром IMG_FILTER_PIXELATE, но "ручная" реализация шире по возможностям и гораздо полезнее для мозгов.

Теперь нам надо переложить словесное описание алгоритма на язык программирования. У меня это PHP, но поняв как это работает, можно реализовать эффект на любом другом языке высокого уровня.
  1. // Файл для обработки
  2. $im=ImageCreateFromJPEG('test.jpg');
  3.  
  4. // Размер блока (коэффициент пикселизации)
  5. $pix=10;
  6.  
  7. // Массив для усредненных цветов блоков
  8. $pixels=array();
  9.  
  10. // Размеры изображения
  11. $width=ImageSX($im);
  12. $height=ImageSY($im);
  13.  
  14. for ($x=0$x<$width$x++) {
  15.     for ($y=0$y<$height$y++) {
  16.         $dx=floor($x/$pix);
  17.         $dy=floor($y/$pix);
  18.  
  19.         if (!isset($pixels[$dx])) {
  20.             $pixels[$dx]=array();
  21.         }
  22.         if (!isset($pixels[$dx][$dy])) {
  23.             $pixels[$dx][$dy]=array(
  24.                 'total_R'=>0,
  25.                 'total_G'=>0,
  26.                 'total_B'=>0,
  27.                 'total'=>0,
  28.             );
  29.         }
  30.  
  31.         $rgb=ImageColorAt($im,$x,$y);
  32.         $pixels[$dx][$dy]['total_R']+=($rgb >> 16) & 0xFF;
  33.         $pixels[$dx][$dy]['total_G']+=($rgb >> 8) & 0xFF;
  34.         $pixels[$dx][$dy]['total_B']+=$rgb 0xFF;
  35.         $pixels[$dx][$dy]['total']++;
  36.     }
  37. }
  38.  
  39. // Заполнить изображение цветными блоками
  40. for ($dx=0$dx<ceil($width/$pix); $dx++) {
  41.     for ($dy=0$dy<ceil($height/$pix); $dy++) {
  42.         // Средний цвет блока
  43.         $avg_R=round($pixels[$dx][$dy]['total_R']/$pixels[$dx][$dy]['total']);
  44.         $avg_G=round($pixels[$dx][$dy]['total_G']/$pixels[$dx][$dy]['total']);
  45.         $avg_B=round($pixels[$dx][$dy]['total_B']/$pixels[$dx][$dy]['total']);
  46.  
  47.         $color=ImageColorAllocate($im$avg_R$avg_G$avg_B);
  48.  
  49.         // Нарисовать блок
  50.         ImageFilledRectangle($im$dx*$pix$dy*$pix
  51.             ($dx+1)*$pix, ($dy+1)*$pix$color);
  52.     }
  53. }
  54.  
  55. // Прибраться за собой
  56. ImageDestroy($im);
Заглавную картинку в статье вы уже увидели, вот еще несколько примеров изображений, выполненных с разными коэффициентами пикселизации.

Эффект пикселизации на PHP
Эффект пикселизации на PHP

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

Эффект пикселизации на PHP
Эффект пикселизации на PHP

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

Эффект пикселизации на PHP
Эффект пикселизации на PHP

Ну и конечно, главный вопрос: где это можно использовать? Например, можно распознавать координаты лиц на фотографиях и автоматически их "замазывать". Также блоки могут быть не квадратными, а прямоугольными. А можно написать скрипт, который из массива цветных блоков, полученных из картинки, будет делать HTML-страницу.

Поделиться ссылкой ВКонтакте
Просмотров: 3078 | Комментариев: 6

Метки: PHP, графика
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (05.12.2016 в 12:11):
Включаешь вывод всех ошибок, смотришь. Если не помогает, то выводишь диагностику после каждой ключевой команды.
Роман (04.12.2016 в 16:02):
Попробовал ваш код в Денвере - не заработало. Может php 5.3 не подоходит для этого?
ManHunter (03.10.2016 в 13:05):
Отслеживается скролл страницы, по достижению маркера окончания статьи подгружаются следующие данные. Примеры и подробные описания гуглятся по запросу "бесконечная прокрутка".

Только какое отношение это имеет к теме статьи??
Дмитрий (03.10.2016 в 11:51):
Занятно конечно, но не могли бы вы, как опытный программист, подсказать как работает эффект смены страниц на сайте РБК. Когда мотаешь статью вниз, она плавно открывает следующую статью и при этом меняет адресную строку браузера. Вот ссылка (не реклама сайта упаси Бог) - http://www.rbc.ru/finances/01/...47f0fa909647

Как это работает в принципе?
ManHunter (28.09.2016 в 23:58):
Андрей (28.09.2016 в 23:30):
Нравится когда киношники этот эффект задом на перед проигрывают. Т.е. берут изображение с какой нибудь говнокамеры в стиле иконка 32х32 и пропускают его через суперфильтры и мегазумы. После чего на лице главного злодея видно даже прыщи и бородавки.

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

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.06 сек. / MySQL: 2 (0.0042 сек.) / Память: 4.5 Mb
Наверх