Изменение размера изображений с прозрачностью в php
Я просмотрел все, как правильно управлять альфой, когда я изменяю размер png. Мне удалось добиться прозрачности, но только для прозрачных пикселей. Здесь мой код:
$src_image = imagecreatefrompng($file_dir.$this->file_name);
$dst_image = imagecreatetruecolor($this->new_image_width, $this->new_image_height);
imagealphablending($dst_image, true);
imagesavealpha($dst_image, true);
$black = imagecolorallocate($dst_image, 0, 0, 0);
imagecolortransparent($dst_image, $black);
imagecopyresampled($dst_image, $src_image, 0, 0, 0, 0, $this->new_image_width,
$this->new_image_height, $this->image_width, $this->image_height);
imagepng($dst_image, $file_dir.$this->file_name);
Начиная с этого исходного изображения:
![enter image description here]()
Измененное изображение выглядит следующим образом:
![enter image description here]()
Решение для почти всех сообщений форума, о которых я рассказывал об этой проблеме, сказал, чтобы сделать что-то вроде этого:
imagealphablending($dst_image, false);
$transparent = imagecolorallocatealpha($dst_image, 0, 0, 0, 127);
imagefill($dst_image, 0, 0, $transparent);
Результаты этого кода не удаляются при сохранении любой альфы:
![enter image description here]()
Есть ли другое решение? Я что-то пропускаю с альфа-смешением? Почему это будет работать для всех остальных, но для меня совершенно не получается? Я использую MAMP 2.1.3 и PHP 5.3.15.
Ответы
Ответ 1
"They have not worked at all and I'm not sure why."
Хорошо, ты, должно быть, делал что-то неправильно. Код из связанного дубликата с несколькими строками, добавленными для загрузки и сохранения изображения:
$im = imagecreatefrompng(PATH_TO_ROOT."var/tmp/7Nsft.png");
$srcWidth = imagesx($im);
$srcHeight = imagesy($im);
$nWidth = intval($srcWidth / 4);
$nHeight = intval($srcHeight /4);
$newImg = imagecreatetruecolor($nWidth, $nHeight);
imagealphablending($newImg, false);
imagesavealpha($newImg,true);
$transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127);
imagefilledrectangle($newImg, 0, 0, $nWidth, $nHeight, $transparent);
imagecopyresampled($newImg, $im, 0, 0, 0, 0, $nWidth, $nHeight,
$srcWidth, $srcHeight);
imagepng($newImg, PATH_TO_ROOT."var/tmp/newTest.png");
Создает изображение:
![A resized PNG with transparency]()
то есть. этот вопрос (и ответ) является полным дубликатом.
Ответ 2
Я использовал класс simpleImage для изменения размера изображения.
Вы можете изменить размер изображения с сохранением пропорций.
этот класс использует imagecreatetruecolor и imagecopyresampled основные функции Php для изменения размера изображения
$new_image = imagecreatetruecolor($width, $height);
imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
$this->image = $new_image;
найти полный код на http://www.white-hat-web-design.co.uk/blog/resizing-images-with-php/