Ресайз изображений с размытым фоном на PHP
Ресайз изображений с размытым фоном на PHP
Некоторое время назад я обратил внимание на интересный графический эффект, который используется в телевидении и социальных сетях. Он применяется, например, для разворачивания вертикального видео на горизонтальный экран без черных полос по бокам, для подгона разномастных изображений под единый формат. Суть этого эффекта заключается в том, что оригинальный кадр или снимок растягивается под нужный размер по ширине или высоте, из его середины вырезается участок нужного размера и сильно размывается. На полученную подложку накладывается оригинальное изображение.
Я решил сделать примерно такой же эффект и написал вот этот скрипт. Если хотите, можете для удобства оформить его в виде функции.
Code (PHP) : Убрать нумерацию
- <?
- //--------------------------------------------------------
- // Ресайз изображения с размытым фоном
- //--------------------------------------------------------
- // Автор: ManHunter / PCL (www.manhunter.ru)
- //--------------------------------------------------------
- // Файл исходного изображения
- $file='image.jpg';
- // Отступ в пикселах
- $padding=10;
- // Размеры нового изображения
- $new_x=600;
- $new_y=600;
- //--------------------------------------------------------
- $im=ImageCreateFromJPEG($file);
- list($x,$y)=GetImageSize($file);
- // Если изображение и так меньше подложки, то отступ обнулить
- if (($new_x-$x)>$padding*2 && ($new_y-$y)>$padding*2) {
- $padding=0;
- }
- $x1=$new_x;
- $y1=$new_y;
- $coeff=min($x/$x1, $y/$y1);
- $src_w=$x1*$coeff;
- $src_h=$y1*$coeff;
- $src_x=floor(($x-$src_w)/2);
- if ($src_x<0) {
- $src_x=0;
- if ($x1>$x) { $x1=$x; }
- $src_w=$x;
- }
- $src_y=floor(($y-$src_h)/2);
- if ($src_y<0) {
- $src_y=0;
- if ($y1>$y) { $y1=$y; }
- $src_h=$y;
- }
- $dst_im=ImageCreateTrueColor($new_x, $new_y);
- // Сделать подложку из растянутого изображения
- ImageCopyResampled($dst_im, $im, 0, 0, $src_x, $src_y,
- $new_x, $new_y, $src_w, $src_h);
- // Размытие изображения подложки
- $blur=4;
- $small_width=ceil($new_x*pow(0.5, $blur));
- $small_height=ceil($new_y*pow(0.5, $blur));
- $tmp_image=$dst_im;
- $prev_width=$new_x;
- $prev_height=$new_y;
- for ($i=0; $i<$blur; $i++) {
- $new_width=$small_width*pow(2, $i);
- $new_height=$small_height*pow(2, $i);
- $new_image=ImageCreateTruecolor($new_width, $new_height);
- ImageCopyResized($new_image, $tmp_image, 0, 0, 0, 0,
- $new_width, $new_height, $prev_width, $prev_height);
- ImageFilter($new_image, IMG_FILTER_GAUSSIAN_BLUR);
- $tmp_image=$new_image;
- $prev_width=$new_width;
- $prev_height=$new_height;
- }
- ImageCopyResized($dst_im, $new_image, 0, 0, 0, 0,
- $new_x, $new_y, $new_width, $new_height);
- ImageFilter($dst_im, IMG_FILTER_GAUSSIAN_BLUR);
- ImageDestroy($new_image);
- // Вписать маленькое изображение в середину подложки
- if ($x<$x1 && $y<$y1) {
- $dst_w=$x;
- $dst_h=$y;
- $dst_x=floor(($new_x-$dst_w)/2);
- $dst_y=floor(($new_y-$dst_h)/2);
- }
- // Поместить отмасштабированное изображение в середину подложки
- else {
- $coeff=max($x/($new_x-$padding*2), $y/($new_y-$padding*2));
- $dst_w=ceil($x/$coeff);
- $dst_h=ceil($y/$coeff);
- $dst_x=floor(($new_x-$dst_w)/2);
- $dst_y=floor(($new_y-$dst_h)/2);
- }
- ImageCopyResampled($dst_im, $im, $dst_x, $dst_y, 0, 0,
- $dst_w, $dst_h, $x, $y);
- ImageDestroy($im);
- // Отправить изображение в браузер
- Header('Content-type: image/jpeg');
- ImageJPEG($dst_im,NULL,100);
- ImageDestroy($dst_im);
Пример работы скрипта
Пример работы скрипта
Пример работы скрипта
Пример работы скрипта
Пример работы скрипта
Пример работы скрипта
Пример работы скрипта
Пример работы скрипта
Пример работы скрипта
Пример работы скрипта
Пример работы скрипта
Просмотров: 3363 | Комментариев: 8
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Степан
(22.08.2020 в 20:07):
Прекрасно!!!
Snatch
(06.10.2017 в 07:01):
Спасибо, работает отлично!
ManHunter
(30.04.2017 в 10:16):
PHP прекрасно работает с командной строкой. Можно собрать простой батничек, скрипт и набор необходимых библиотек из PHP, вот и получится конвертер.
fedor
(30.04.2017 в 06:16):
Может кто подскажет exe-конвертер?
Андрей
(28.04.2017 в 13:55):
Телевидение оно такое, Александра Серова по всем каналам-)
ManHunter
(28.04.2017 в 10:34):
brute, чем тебе Сашка не угодила? Вполне симпатичная девушка, у кого-то Лена Содерберг в качестве графической модели, у меня Саша. А Данику, как я понимаю, не узнал? :)
brute
(28.04.2017 в 08:53):
Ради размещения нескольких фоток Грэй пришлось целую статью писать:)
Владислав
(27.04.2017 в 20:18):
тоже заметил, на Вестях (Россия24), тоже хотел такое сделать) Спасибо!
Добавить комментарий
Заполните форму для добавления комментария