Blog. Just Blog

Как на PHP правильно ресайзить картинки с прозрачностью

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

Многие начинающие программисты на PHP, когда дело доходит до работы с графикой, сталкиваются с одной и той же проблемой. При ресайзе у прозрачных картинок GIF и PNG получается черный фон, прозрачность при этом теряется. В интернете полно примеров готовых скриптов для автоматического ресайза картинок, где раз за разом повторяется эта ошибка. Давайте попробуем разобраться, как на PHP правильно ресайзить картинки с прозрачностью.

Начнем с изображений в формате PNG. В файлах PNG прозрачность реализована так называемым альфа каналом, определяющим степень прозрачности каждого пиксела. При ресайзе PNG-файлов альфа канал нужно учитывать. Сперва отключаем режим сопряжения цветов с помощью функции ImageAlphaBlending, затем устанавливаем флаг сохранения всей информации альфа канала с помощью ImageSaveAlpha. Скрипт для ресайза прозрачных PNG выглядит примерно так:
  1. // Загрузить исходное изображение
  2. $file='file.png';
  3. $im=ImageCreateFromPNG($file);
  4.  
  5. // Получить размеры изображения
  6. list($old_width$old_height)=GetImageSize($file);
  7.  
  8. // Новые размеры изображения
  9. $new_width=100;
  10. $new_height=100;
  11.  
  12. // Создать полноцветное изображение для ресайза
  13. $dst=ImageCreateTrueColor($new_width$new_height);
  14.  
  15. // Отключить режим сопряжения цветов для изображения
  16. ImageAlphaBlending($dstfalse);
  17.  
  18. // Включить сохранение альфа канала
  19. ImageSaveAlpha($dsttrue);
  20.  
  21. // Ресайз изображения
  22. ImageCopyResampled($dst$im0000
  23.     $new_width$new_height$old_width$old_height);
  24.  
  25. // Сохранить в файл
  26. ImagePNG($dst'out.png');
В изображениях в формате GIF прозрачность реализована иначе. В палитре кадра выбирается один цвет и помечается как прозрачный. Чаще всего в этой роли используется розовый, наверное, как самый редко используемый в самих изображениях. Но никто не мешает использовать для этого любой другой цвет из палитры. Графические редакторы или программы просмотра при отрисовке изображения просто заменяют все точки этого цвета на прозрачные.

Прозрачность в GIF
Прозрачность в GIF

Поэтому для ресайза изображения в формате GIF требуется собственный обработчик. Надо узнать, есть ли в исходном изображении прозрачный цвет, и если есть, то получить его значения. После этого надо прописать этот цвет в палитру результирующего изображения и пометить, что он является прозрачным. Скрипт для ресайза прозрачных GIF выглядит примерно так:
  1. // Загрузить исходное изображение
  2. $file='file.gif';
  3. $im=ImageCreateFromGIF($file);
  4.  
  5. // Получить размеры изображения
  6. list($old_width$old_height)=GetImageSize($file);
  7.  
  8. // Новые размеры изображения
  9. $new_width=100;
  10. $new_height=100;
  11.  
  12. // Создать полноцветное изображение для ресайза
  13. $dst=ImageCreateTrueColor($new_width$new_height);
  14.  
  15. // Получить прозрачный цвет исходного изображения
  16. $old_index=ImageColorTransparent($im);
  17.  
  18. // Если прозрачность обозначена, то дополнительная обработка
  19. if ($old_index!=-1) {
  20.     $new_color=ImageColorsForIndex($im$old_index);
  21.  
  22.     // Добавить прозрачный цвет в палитру нового изображения
  23.     $new_index=ImageColorAllocate($dst
  24.         $new_color['red'], $new_color['green'], $new_color['blue']);
  25.  
  26.     // Обозначить добавленный цвет как прозрачный
  27.     ImageColorTransparent($dst$new_index);
  28. }
  29.  
  30. // Ресайз изображения
  31. ImageCopyResampled($dst$im0000,
  32.     $new_width$new_height$old_width$old_height);
  33.  
  34. // Сохранить в файл
  35. ImageGIF($dst'out.gif');
Универсальный скрипт для ресайза изображений должен учитывать особенности форматов PNG и GIF и обрабатывать их соответственно. В примерах я оставил только основной функционал, никаких проверок на наличие файла и соответствие его формату не производится, вы это можете сделать самостоятельно.

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

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

Комментарии

Отзывы посетителей сайта о статье
morgot (24.09.2019 в 05:11):
Спасибо! Как всегда, ищу какое-то экзотическое решение и нахожу только в твоем блоге.
billymon (19.11.2016 в 16:19):
Спасибо! Полезная информация, и очень вовремя :о)
Sedoy (14.11.2016 в 22:21):
Большое спасибо за интересную статью.Давно интересовала эта тема :-).

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

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

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