Изменение размера изображения (ресайз) PNG с сохранением прозрачности в PHP
Для того, чтобы при ресайзе изображения в формате PNG с помощью PHP-скрипта сохранялась прозрачность необходимо выполнить следующие действия:
//открываем исходное изображение
$src = ImageCreateFromPNG($dir . $_FILES[$k]['name']);
//создаем дескриптор для уменьшенного изображения
$dst = imagecreatetruecolor($max_width, $max_width / $xy);
//устанавливаем прозрачность
$this->setTransparency($dst, $src);
//изменяем размер
ImageCopyResampled($dst, $src, 0, 0, 0, 0, $max_width, $max_width / $xy, $width, $height);
//сохраняем уменьшенное изображение в файл
ImagePNG($dst, $dir_small . $_FILES[$k]['name']);
//закрываем дескрипторы исходного и уменьшенного изображений
ImageDestroy($src);
ImageDestroy($dst);
код самой функции setTransparency:
//открываем исходное изображение
$src = ImageCreateFromPNG($dir . $_FILES[$k]['name']);
//создаем дескриптор для уменьшенного изображения
$dst = imagecreatetruecolor($max_width, $max_width / $xy);
//устанавливаем прозрачность
$this->setTransparency($dst, $src);
//изменяем размер
ImageCopyResampled($dst, $src, 0, 0, 0, 0, $max_width, $max_width / $xy, $width, $height);
//сохраняем уменьшенное изображение в файл
ImagePNG($dst, $dir_small . $_FILES[$k]['name']);
//закрываем дескрипторы исходного и уменьшенного изображений
ImageDestroy($src);
ImageDestroy($dst);
код самой функции setTransparency:
function setTransparency($new_image, $image_source)
{
$transparencyIndex = imagecolortransparent($image_source);
$transparencyColor = array('red' => 255, 'green' => 255, 'blue' => 255);
if ($transparencyIndex >= 0)
$transparencyColor = imagecolorsforindex($image_source, $transparencyIndex);
$transparencyIndex = imagecolorallocate($new_image, $transparencyColor['red'], $transparencyColor['green'], $transparencyColor['blue']);
imagefill($new_image, 0, 0, $transparencyIndex);
imagecolortransparent($new_image, $transparencyIndex);
}
{
$transparencyIndex = imagecolortransparent($image_source);
$transparencyColor = array('red' => 255, 'green' => 255, 'blue' => 255);
if ($transparencyIndex >= 0)
$transparencyColor = imagecolorsforindex($image_source, $transparencyIndex);
$transparencyIndex = imagecolorallocate($new_image, $transparencyColor['red'], $transparencyColor['green'], $transparencyColor['blue']);
imagefill($new_image, 0, 0, $transparencyIndex);
imagecolortransparent($new_image, $transparencyIndex);
}

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