Blog. Just Blog

Ресайз изображений с размытым фоном на PHP

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

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

Я решил сделать примерно такой же эффект и написал вот этот скрипт. Если хотите, можете для удобства оформить его в виде функции.
  1. <?
  2. //--------------------------------------------------------
  3. // Ресайз изображения с размытым фоном
  4. //--------------------------------------------------------
  5. // Автор: ManHunter / PCL (www.manhunter.ru)
  6. //--------------------------------------------------------
  7. // Файл исходного изображения
  8. $file='image.jpg';
  9.  
  10. // Отступ в пикселах
  11. $padding=10;
  12.  
  13. // Размеры нового изображения
  14. $new_x=600;
  15. $new_y=600;
  16. //--------------------------------------------------------
  17.  
  18. $im=ImageCreateFromJPEG($file);
  19. list($x,$y)=GetImageSize($file);
  20.  
  21. // Если изображение и так меньше подложки, то отступ обнулить
  22. if (($new_x-$x)>$padding*&& ($new_y-$y)>$padding*2) {
  23.     $padding=0;
  24. }
  25.  
  26. $x1=$new_x;
  27. $y1=$new_y;
  28.  
  29. $coeff=min($x/$x1$y/$y1);
  30.  
  31. $src_w=$x1*$coeff;
  32. $src_h=$y1*$coeff;
  33.  
  34. $src_x=floor(($x-$src_w)/2);
  35. if ($src_x<0) {
  36.     $src_x=0;
  37.     if ($x1>$x) { $x1=$x; }
  38.     $src_w=$x;
  39. }
  40. $src_y=floor(($y-$src_h)/2);
  41. if ($src_y<0) {
  42.     $src_y=0;
  43.     if ($y1>$y) { $y1=$y; }
  44.     $src_h=$y;
  45. }
  46.  
  47. $dst_im=ImageCreateTrueColor($new_x$new_y);
  48.  
  49. // Сделать подложку из растянутого изображения
  50. ImageCopyResampled($dst_im$im00$src_x$src_y,
  51.     $new_x$new_y$src_w$src_h);
  52.  
  53. // Размытие изображения подложки
  54. $blur=4;
  55.  
  56. $small_width=ceil($new_x*pow(0.5$blur));
  57. $small_height=ceil($new_y*pow(0.5$blur));
  58.  
  59. $tmp_image=$dst_im;
  60. $prev_width=$new_x;
  61. $prev_height=$new_y;
  62.  
  63. for ($i=0$i<$blur$i++) {
  64.     $new_width=$small_width*pow(2$i);
  65.     $new_height=$small_height*pow(2$i);
  66.  
  67.     $new_image=ImageCreateTruecolor($new_width$new_height);
  68.     ImageCopyResized($new_image$tmp_image0000,
  69.         $new_width$new_height$prev_width$prev_height);
  70.  
  71.     ImageFilter($new_imageIMG_FILTER_GAUSSIAN_BLUR);
  72.  
  73.     $tmp_image=$new_image;
  74.     $prev_width=$new_width;
  75.     $prev_height=$new_height;
  76. }
  77.  
  78. ImageCopyResized($dst_im$new_image0000,
  79.     $new_x$new_y$new_width$new_height);
  80. ImageFilter($dst_imIMG_FILTER_GAUSSIAN_BLUR);
  81.  
  82. ImageDestroy($new_image);
  83.  
  84. // Вписать маленькое изображение в середину подложки
  85. if ($x<$x1 && $y<$y1) {
  86.     $dst_w=$x;
  87.     $dst_h=$y;
  88.  
  89.     $dst_x=floor(($new_x-$dst_w)/2);
  90.     $dst_y=floor(($new_y-$dst_h)/2);
  91. }
  92. // Поместить отмасштабированное изображение в середину подложки
  93. else {
  94.     $coeff=max($x/($new_x-$padding*2), $y/($new_y-$padding*2));
  95.  
  96.     $dst_w=ceil($x/$coeff);
  97.     $dst_h=ceil($y/$coeff);
  98.  
  99.     $dst_x=floor(($new_x-$dst_w)/2);
  100.     $dst_y=floor(($new_y-$dst_h)/2);
  101. }
  102.  
  103. ImageCopyResampled($dst_im$im$dst_x$dst_y00,
  104.     $dst_w$dst_h$x$y);
  105.  
  106. ImageDestroy($im);
  107.  
  108. // Отправить изображение в браузер
  109. Header('Content-type: image/jpeg');
  110. ImageJPEG($dst_im,NULL,100);
  111.  
  112. ImageDestroy($dst_im);
В скрипте отсутствуют проверки на корректность формата исходного файла, оставлен минимально необходимый код и предполагается, что изображение JPEG. Вот несколько примеров работы скрипта. Горизонтальные, вертикальные и квадратные фотографии подогнаны под нужный размер, в некоторых использован отступ.

Пример работы скрипта
Пример работы скрипта

Пример работы скрипта
Пример работы скрипта

Пример работы скрипта
Пример работы скрипта

Пример работы скрипта
Пример работы скрипта

Пример работы скрипта
Пример работы скрипта

Пример работы скрипта
Пример работы скрипта

Пример работы скрипта
Пример работы скрипта

Пример работы скрипта
Пример работы скрипта

Пример работы скрипта
Пример работы скрипта

Пример работы скрипта
Пример работы скрипта

Пример работы скрипта
Пример работы скрипта


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

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

Комментарии

Отзывы посетителей сайта о статье
Степан (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), тоже хотел такое сделать) Спасибо!

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

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

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