Как на PHP правильно ресайзить картинки с прозрачностью
Как на PHP правильно ресайзить картинки с прозрачностью
Многие начинающие программисты на PHP, когда дело доходит до работы с графикой, сталкиваются с одной и той же проблемой. При ресайзе у прозрачных картинок GIF и PNG получается черный фон, прозрачность при этом теряется. В интернете полно примеров готовых скриптов для автоматического ресайза картинок, где раз за разом повторяется эта ошибка. Давайте попробуем разобраться, как на PHP правильно ресайзить картинки с прозрачностью.
Начнем с изображений в формате PNG. В файлах PNG прозрачность реализована так называемым альфа каналом, определяющим степень прозрачности каждого пиксела. При ресайзе PNG-файлов альфа канал нужно учитывать. Сперва отключаем режим сопряжения цветов с помощью функции ImageAlphaBlending, затем устанавливаем флаг сохранения всей информации альфа канала с помощью ImageSaveAlpha. Скрипт для ресайза прозрачных PNG выглядит примерно так:
Code (PHP) : Убрать нумерацию
- // Загрузить исходное изображение
- $file='file.png';
- $im=ImageCreateFromPNG($file);
- // Получить размеры изображения
- list($old_width, $old_height)=GetImageSize($file);
- // Новые размеры изображения
- $new_width=100;
- $new_height=100;
- // Создать полноцветное изображение для ресайза
- $dst=ImageCreateTrueColor($new_width, $new_height);
- // Отключить режим сопряжения цветов для изображения
- ImageAlphaBlending($dst, false);
- // Включить сохранение альфа канала
- ImageSaveAlpha($dst, true);
- // Ресайз изображения
- ImageCopyResampled($dst, $im, 0, 0, 0, 0,
- $new_width, $new_height, $old_width, $old_height);
- // Сохранить в файл
- ImagePNG($dst, 'out.png');
Прозрачность в GIF
Поэтому для ресайза изображения в формате GIF требуется собственный обработчик. Надо узнать, есть ли в исходном изображении прозрачный цвет, и если есть, то получить его значения. После этого надо прописать этот цвет в палитру результирующего изображения и пометить, что он является прозрачным. Скрипт для ресайза прозрачных GIF выглядит примерно так:
Code (PHP) : Убрать нумерацию
- // Загрузить исходное изображение
- $file='file.gif';
- $im=ImageCreateFromGIF($file);
- // Получить размеры изображения
- list($old_width, $old_height)=GetImageSize($file);
- // Новые размеры изображения
- $new_width=100;
- $new_height=100;
- // Создать полноцветное изображение для ресайза
- $dst=ImageCreateTrueColor($new_width, $new_height);
- // Получить прозрачный цвет исходного изображения
- $old_index=ImageColorTransparent($im);
- // Если прозрачность обозначена, то дополнительная обработка
- if ($old_index!=-1) {
- $new_color=ImageColorsForIndex($im, $old_index);
- // Добавить прозрачный цвет в палитру нового изображения
- $new_index=ImageColorAllocate($dst,
- $new_color['red'], $new_color['green'], $new_color['blue']);
- // Обозначить добавленный цвет как прозрачный
- ImageColorTransparent($dst, $new_index);
- }
- // Ресайз изображения
- ImageCopyResampled($dst, $im, 0, 0, 0, 0,
- $new_width, $new_height, $old_width, $old_height);
- // Сохранить в файл
- ImageGIF($dst, 'out.gif');
Просмотров: 3562 | Комментариев: 3
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Добавить комментарий
Заполните форму для добавления комментария