php imagerotate() портит альфу на png?

Я ломал голову над чем-то простым..

// ....all prev code is fine.... 
$pasteboard =imagecreatetruecolor($imgs['bg']["width"],$imgs['bg']["height"]);
imagealphablending($pasteboard, false);
imagecopyresampled($pasteboard, $imgs['bg']["img"],0,0,0,0,$imgs['bg']["width"],$imgs['bg']["width"],imagesx($imgs['bg']["img"]),imagesy($imgs['bg']["img"]));
imagecopyresampled($pasteboard, $imgs['photo']["img"],20,20,0,0,$imgs['photo']["width"],$imgs['photo']["width"],imagesx($imgs['photo']["img"]),imagesy($imgs['photo']["img"]));
imagesavealpha($pasteboard,true);
//send it out
$out = $pasteboard;

header('Content-type: image/png');
imagepng($out);
//then garbage collection

дает мне это:

введите здесь описание изображения

УРА!

идеальный альфа-композит png...

Теперь я хочу повернуть его, поэтому вместо $out=$pasteboard я делаю это:

imagesavealpha($pasteboard,true);
//rotate it
$out = imagerotate($pasteboard,5,imagecolorexactalpha($pasteboard,255,255,255,50),0);

header('Content-type: image/png');
imagepng($out);

который, к сожалению, дает мне это:

введите здесь описание изображения

БУООО!

Я попытался установить цвет следующим образом:

imagerotate($pasteboard,5,0x00000000,0);

также последний атрибут, например:

imagerotate($pasteboard,5,0x00000000,1);

выборка новых пустых изображений и т. д. и т. д.

без кубика....

Кто-нибудь может помочь?


person Alex    schedule 22.08.2012    source источник
comment
Попробуйте повернуть его, прежде чем вызывать imagesavealpha   -  person Musa    schedule 23.08.2012
comment
спасибо, @Musa тоже попробовал это ..!   -  person Alex    schedule 23.08.2012
comment
ignore_transparent (4-й параметр) был добавлен только в PHP 5.1. Проверьте, какую версию PHP вы используете с echo phpversion();   -  person xconspirisist    schedule 23.08.2012
comment
спасибо @xconspirisist, к сожалению, я уже видел это.. версия 5.3   -  person Alex    schedule 23.08.2012


Ответы (3)


Я отвечаю на свой вопрос просто потому, что я попробовал 10-15 предложений, которые я видел по всему Интернету, и все они предлагают «почти» правильные решения, но ничего точного. Также я видел, что этот вопрос опубликован в нескольких местах, и надеюсь, если кто-нибудь попадет на эту страницу в будущем, было бы лучше показать решение как прямой ответ.

ОГРОМНОЕ спасибо @cristobal за помощь и усилия, если бы я мог проголосовать за вас больше, я бы это сделал!

Способность, кажется, заключается в следующем:

//rotate it
$pasteboard = imagerotate($pasteboard,5,0XFFFFFF00,0); //<-- here must be RRGGBBAA, also last attr set to 0
imagesavealpha($pasteboard, true); // <-- then to save it... dont ask me why..
//send it out
header('Content-type: image/png');
imagepng($pasteboard);

выдает это (у него идеальная альфа-версия, даже если вы не видите его на белой странице):

введите здесь описание изображения

ДЕЙСТВИТЕЛЬНО не самые веселые 5 часов в моей жизни... надеюсь, это остановит кого-то еще, кто проходит через ту же боль..

person Alex    schedule 23.08.2012

Используя тот же код выше и используя синий цвет для третьего параметра в операции imagerotate, которая будет использоваться для заполнения непокрытой зоны после поворота, т.е.:

imagerotate($pasteboard, 5, 255);

Получаем следующее изображение

Повернуто с использованием синего цвета в качестве третьего параметра

мы видим, что синяя область — это непокрытая зона, которую она заполняет, в то время как черный цвет — это граничная тень от изображения, которую GD, похоже, плохо обрабатывает при интерполяции, используемой при вращении.

То же изображение, повернутое с помощью конвертера для imagemagick. команда, т.е. $> convert -rotate 5 image.png image_rotated.png приводит к изображению ниже

повернуто с помощью imagemagick

Очевидно, что GD плохо обрабатывает альфа-цвета при вращении.

Если у вас есть доступ к использованию команды convert с использованием exec или process, вместо этого вы должны передать эти операции с изображениями в imagemagick. GD — это простая библиотека изображений, которая не сильно обновлялась в последние годы. В противном случае попробуйте Imagemagick, Cairo или Gmagick, для которых также есть плагины pecl для http://php.net/manual/en/book.image.php.

В крайнем случае кто-то сделал функцию, которая использует GD http://www.exorithm.com/algorithm/view/rotate_image_alpha для того, что вы ищете, но результат не очень хорош, поскольку это простая линейная интерполяция:

линейная интерполяция

взято из Как повернуть изображение в Библиотека изображений GD с сохранением прозрачности?. Возможно, если вы преобразуете функцию линейной интерполяции в бикубическую или четырехъядерную, она будет выглядеть лучше.

person cristobal    schedule 23.08.2012

Обратите внимание, что эти ответы не сработали для меня, но это сработало.

$destimg = imagecreatefromjpeg("image.png");
$rotatedImage = imagerotate($destimg, 200, 0);
imagesavealpha($rotatedImage, true);
imagepng($rotatedImage,"rotated.png");
person ykay says Reinstate Monica    schedule 21.01.2016