Эффект тиснения на PHP
Эффект тиснения на PHP
Очередное эффектное преобразование изображения на PHP. Сегодня это будет эффект тиснения, то есть имитация объема или наоборот, вдавливания изображения в фон. Подобрав правильный стиль для конкретного изображения, а также совмещая тиснение с другими эффектами, можно добиться очень интересных результатов.
Каждый стиль задается матрицей со смещениями миксуемых пикселов, в приведенном примере их 5.
Code (PHP) : Убрать нумерацию
- // Стиль тиснения 0..4
- $emboss_style=0;
- // Изображение для обработки
- $file='image.jpg';
- // Матрицы стилей тиснения
- $matrix=array(
- array(
- array(1.0, 0.0, -1.0),
- array(2.0, 0.0, -2.0),
- array(1.0, 0.0, -1.0),
- ),
- array(
- array(1.0, 2.0, 1.0),
- array(0.0, 0.0, 0.0),
- array(-1.0, -2.0, -1.0),
- ),
- array(
- array(2.0, 1.0, 0.0),
- array(1.0, 0.0, -1.0),
- array(0.0, -1.0, -2.0),
- ),
- array(
- array(-2.0, -1.0, 0.0),
- array(-1.0, 0.0, 1.0),
- array(0.0, 1.0, 2.0),
- ),
- array(
- array(-2.0, -2.0, 0.0),
- array(-2.0, 6.0, 0.0),
- array(0.0, 0.0, 0.0),
- ),
- );
- $im=ImageCreateFromJPEG($file);
- $width=ImageSX($im);
- $height=ImageSY($im);
- $gray_pixels=array();
- 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=intval(0.2126*$R+0.7152*$G+0.0722*$B);
- if ($gray>255) {
- $gray=255;
- }
- $gray_pixels[$y*$width+$x]=$gray;
- }
- }
- $min=1000000;
- $max=0;
- $emboss=array();
- for ($y=0; $y<$height; $y++) {
- $y_prev=$y-1;
- if ($y_prev<0) {
- $y_prev=0;
- }
- $y_next=$y+1;
- if ($y_next>$height-1) {
- $y_next=$height-1;
- }
- $w1=$y_prev*$width;
- $w2=$y*$width;
- $w3=$y_next*$width;
- for ($x=0; $x<$width; $x++) {
- $x_prev=$x-1;
- if ($x_prev<0) {
- $x_prev=0;
- }
- $x_next=$x+1;
- if ($x_next>$width-1) {
- $x_next=$width-1;
- }
- $new=
- $gray_pixels[$w1+$x_prev]*$matrix[$emboss_style][0][0]+
- $gray_pixels[$w1+$x]*$matrix[$emboss_style][0][1]+
- $gray_pixels[$w1+$x_next]*$matrix[$emboss_style][0][2]+
- $gray_pixels[$w2+$x_prev]*$matrix[$emboss_style][1][0]+
- $gray_pixels[$w2+$x]*$matrix[$emboss_style][1][1]+
- $gray_pixels[$w2+$x_next]*$matrix[$emboss_style][1][2]+
- $gray_pixels[$w3+$x_prev]*$matrix[$emboss_style][2][0]+
- $gray_pixels[$w3+$x]*$matrix[$emboss_style][2][1]+
- $gray_pixels[$w3+$x_next]*$matrix[$emboss_style][2][2];
- $emboss[$y*$width+$x]=$new;
- $min=min($min,$new);
- $max=max($max,$new);
- }
- }
- if (($diff=$max-$min)<1) {
- $diff=1;
- }
- for ($x=0; $x<$width; $x++) {
- for ($y=0; $y<$height; $y++) {
- $clr=($emboss[$y*$width+$x]-$min)*255/$diff;
- $color=ImageColorAllocate($im,$clr,$clr,$clr);
- ImageSetPixel($im,$x,$y,$color);
- }
- }
- // Вывести изображение в браузер
- header("Content-type: image/jpeg");
- ImageJPEG($im,NULL,100);
- // Прибраться за собой
- ImageDestroy($im);
Оригинальное изображение
Эффект тиснения на PHP
Эффект тиснения на PHP
Эффект тиснения на PHP
Эффект тиснения на PHP
Эффект тиснения на PHP
Да, я в курсе про существование штатной функции PHP Imagefilter с фильтром IMG_FILTER_EMBOSS. Вот какой результат она дает на этом же изображении, причем только один, без возможности настроек.
Результат работы функции Imagefilter
Стоит отметить, что по скорости она заметно превосходит самодельную. Так что использовать свою функцию с возможностью гибкой настройки или быструю штатную - это вы решайте самостоятельно.
Просмотров: 488 | Комментариев: 2
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(24.04.2023 в 21:33):
Тут главный смысл в алгоритме, а не в наборе готовых функций.
Petya
(24.04.2023 в 19:18):
Судя по коду, у Вас там свёртка + обесцвечивание, а претензия к встроенному EMBOSS - корявое ядро. Отсюда вопрос: на предмет скорости с приличным качеством, не смотрели на imageconvolution (https://www.php.net/manual/ru/function.imageconvolution.php) + IMAGE_FILTER_COLORIZE со своими коэффициентами?
Добавить комментарий
Заполните форму для добавления комментария