2013-06-07 4 views
10

Я рассмотрел все, как правильно управлять альфой, когда я изменяю размер png. Мне удалось добиться прозрачности, но только для прозрачных пикселей. Вот мой код:Изменение размера изображений с прозрачностью в php

$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

Решение почти каждый пост на форуме I Мы рассмотрели этот вопрос, чтобы сказать что-то вроде этого:

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.

+0

Возможный дубликат [Как изменить размер PNG с прозрачностью в PHP?] (Http://stackoverflow.com/questions/279236/how-do-i-resize-pngs-with-transparency-in-php) – Danack

+0

Я пробовал решения, приведенные в этом сообщении (и многие другие). Они не работали вообще, и я не знаю, почему. – user2458399

ответ

-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/

+0

Это не вопрос, но он оффтоп, так как искатель специально предназначен для встроенной библиотеки PHP GD ... (это должен быть комментарий, а не ответ) –

9
"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

т.е. этот вопрос (и ответ) являются полной копией ,

+0

Какая платформа, версия PHP/GD/Imagemagick у вас есть? Вероятно, это причина. В качестве альтернативы переполнение стека может быть переработкой исходного изображения, чтобы вы не тестировали одно и то же изображение. – peterjwest

Смежные вопросы