Я передумал, как правильно управлять альфой, когда я изменяю размер 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);
Начиная с этого исходного изображения:
Измененное изображение выглядит следующим образом:
Решение почти для каждого сообщения в форуме, о котором я рассказывал об этой проблеме, говорит, чтобы сделать что-то вроде этого:
imagealphablending($dst_image, false); $transparent = imagecolorallocatealpha($dst_image, 0, 0, 0, 127); imagefill($dst_image, 0, 0, $transparent);
Результаты этого кода не могут спасти любую альфу:
Есть ли другое решение? Я что-то пропускаю с альфа-смешением? Почему это будет работать для всех остальных, но для меня совершенно не получается? Я использую MAMP 2.1.3 и PHP 5.3.15.
"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");
Производит изображение:
т.е. этот вопрос (и ответ) является полным дубликатом.
Я использовал класс simpleImage для изменения размера изображения. Вы можете изменить размер изображения с сохранением пропорций. этот класс использует функции imagecreatetruecoror и imagecopyresampled core 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/