PNG прозрачность с PHP - PullRequest
       29

PNG прозрачность с PHP

43 голосов
/ 24 ноября 2008

Эй, у меня возникли проблемы с сохранением прозрачности в png, когда я создаю из него миниатюру, у кого-нибудь есть опыт? любая помощь будет отличной, вот что я сейчас делаю:

$fileName= "../js/ajaxupload/tees/".$fileName;

list($width, $height) = getimagesize($fileName);

$newwidth = 257;
$newheight = 197;

$thumb = imagecreatetruecolor($newwidth, $newheight);
imagealphablending($thumb, true);
$source = imagecreatefrompng($fileName);
imagealphablending($source, true);

imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

imagesavealpha($thumb, true);
imagepng($thumb,$newFilename);

Ответы [ 5 ]

82 голосов
/ 24 ноября 2008

У меня был успех, когда я делал это в прошлом:

$thumb = imagecreatetruecolor($newwidth, $newheight);
imagealphablending($thumb, false);
imagesavealpha($thumb, true);  

$source = imagecreatefrompng($fileName);
imagealphablending($source, true);

imagecopyresampled($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

imagepng($thumb,$newFilename);

Я нашел качество выходного изображения намного лучше, используя imagecopyresampled(), чем imagecopyresized()

13 голосов
/ 22 февраля 2011

Забудьте индекс прозрачности цвета, он никогда не работает во всех продуктах рендеринга. Вместо этого используйте маску альфа-слоя:

$image = imagecreatetruecolor($size, $size);

imagealphablending($image, false);
imagesavealpha($image, true);

$trans_layer_overlay = imagecolorallocatealpha($image, 220, 220, 220, 127);
imagefill($image, 0, 0, $trans_layer_overlay);
2 голосов
/ 24 ноября 2008

Эти функции обращаются к лежащей в основе библиотеке gdlib, которая является хорошей игрушкой, но не то, что дает хорошие результаты. Если у вас есть опция, используйте imagemagick . Недостатком является то, что в настоящее время нет хороших php-привязок, поэтому вам нужно получить к нему доступ через оболочку, что обычно запрещено на общих хостах.

2 голосов
/ 24 ноября 2008

imagecopyresized не поддерживает прозрачность должным образом.

imagecopymerge делает, но не меняет размер.

Решение? Вы, вероятно, в конечном итоге измените размер вещи вручную.

1 голос
/ 24 ноября 2008

См. ответ Дейси на "Как мне изменить размер ..." . По сути, вам нужно заполнить весь фон прозрачностью, прежде чем выполнять какие-либо другие операции.

...