Эффект пикселизации на PHP
Эффект пикселизации на PHP
Очередная реализация графических эффектов на PHP. На этот раз будет эффект пикселизации. Он заключается в следующем: изображение делится на квадраты (блоки) нужного размера, в каждом из них определяется основной цвет, затем выполняется заливка квадрата полностью этим цветом. Да, я в курсе про существование штатной функции PHP imagefilter с параметром IMG_FILTER_PIXELATE, но "ручная" реализация шире по возможностям и гораздо полезнее для мозгов.
Теперь нам надо переложить словесное описание алгоритма на язык программирования. У меня это PHP, но поняв как это работает, можно реализовать эффект на любом другом языке высокого уровня.
Code (PHP) : Убрать нумерацию
- // Файл для обработки
- $im=ImageCreateFromJPEG('test.jpg');
- // Размер блока (коэффициент пикселизации)
- $pix=10;
- // Массив для усредненных цветов блоков
- $pixels=array();
- // Размеры изображения
- $width=ImageSX($im);
- $height=ImageSY($im);
- for ($x=0; $x<$width; $x++) {
- for ($y=0; $y<$height; $y++) {
- $dx=floor($x/$pix);
- $dy=floor($y/$pix);
- if (!isset($pixels[$dx])) {
- $pixels[$dx]=array();
- }
- if (!isset($pixels[$dx][$dy])) {
- $pixels[$dx][$dy]=array(
- 'total_R'=>0,
- 'total_G'=>0,
- 'total_B'=>0,
- 'total'=>0,
- );
- }
- $rgb=ImageColorAt($im,$x,$y);
- $pixels[$dx][$dy]['total_R']+=($rgb >> 16) & 0xFF;
- $pixels[$dx][$dy]['total_G']+=($rgb >> 8) & 0xFF;
- $pixels[$dx][$dy]['total_B']+=$rgb & 0xFF;
- $pixels[$dx][$dy]['total']++;
- }
- }
- // Заполнить изображение цветными блоками
- for ($dx=0; $dx<ceil($width/$pix); $dx++) {
- for ($dy=0; $dy<ceil($height/$pix); $dy++) {
- // Средний цвет блока
- $avg_R=round($pixels[$dx][$dy]['total_R']/$pixels[$dx][$dy]['total']);
- $avg_G=round($pixels[$dx][$dy]['total_G']/$pixels[$dx][$dy]['total']);
- $avg_B=round($pixels[$dx][$dy]['total_B']/$pixels[$dx][$dy]['total']);
- $color=ImageColorAllocate($im, $avg_R, $avg_G, $avg_B);
- // Нарисовать блок
- ImageFilledRectangle($im, $dx*$pix, $dy*$pix,
- ($dx+1)*$pix, ($dy+1)*$pix, $color);
- }
- }
- // Прибраться за собой
- ImageDestroy($im);
Эффект пикселизации на PHP
При небольшом коэффициенте пикселизации изображение остается вполне различимым. Если посмотреть на него с расстояния или уменьшить до размера превьюшки, то изображение и вовсе мало отличается от исходного.
Эффект пикселизации на PHP
При увеличении коэффициента пикселизации детали изображения, естественно, теряются. Даже на уменьшенной картинке отчетливо видны искажения.
Эффект пикселизации на PHP
Ну и конечно, главный вопрос: где это можно использовать? Например, можно распознавать координаты лиц на фотографиях и автоматически их "замазывать". Также блоки могут быть не квадратными, а прямоугольными. А можно написать скрипт, который из массива цветных блоков, полученных из картинки, будет делать HTML-страницу.
Просмотров: 3213 | Комментариев: 6
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
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):
Классика же :) http://img.ifcdn.com/images/ea...f9d75f_1.jpg
Андрей
(28.09.2016 в 23:30):
Нравится когда киношники этот эффект задом на перед проигрывают. Т.е. берут изображение с какой нибудь говнокамеры в стиле иконка 32х32 и пропускают его через суперфильтры и мегазумы. После чего на лице главного злодея видно даже прыщи и бородавки.
Добавить комментарий
Заполните форму для добавления комментария