php imagerotate()在png上破坏alpha?

时间:2012-08-22 22:51:28

标签: php gd php-gd

我一直在抨击我的脑袋......

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

给了我这个:

enter image description here

HORAY!

完美的alpha 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);

遗憾地给了我这个:

enter image description here

BOOOO!

我尝试过设置颜色:

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

也是最后一个像:

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

新的空图像采样等等......

没有骰子......

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:5)

我正在回答我的问题只是因为我已经尝试了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);

产生这个(它有一个完美的alpha,即使你看不到白页):

enter image description here

真的不是我生命中最有趣的5小时......希望它会阻止别人经历同样的痛苦......

答案 1 :(得分:2)

使用上面相同的代码并在imagerotate操作中使用蓝色作为第三个参数,这将用于在旋转后填充未覆盖的区域,即:

imagerotate($pasteboard, 5, 255);

我们得到以下图片

Rotated using blue as third parameter

我们看到蓝色区域是它填充的未覆盖区域,而黑色区域是图像的边界阴影,GD在旋转中使用的插值似乎不能很好地处理。

使用convert for imagemagick旋转相同的图像。 commmand ie $> convert -rotate 5 image.png image_rotated.png导致下面的图像

rotated using imagemagick

显然GD在旋转时不能很好地处理alpha颜色。

如果您有权使用convertexec使用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来处理你正在寻找的东西,但结果并不漂亮,因为它是一个简单的线性插值:

linear interpolation

取自How to rotate an image in GD Image Library while keeping transparency?。也许如果将线性插值函数转换为双立方或四元组,它看起来会更好。

答案 2 :(得分:0)

请注意,这些答案对我不起作用,但确实如此。

$destimg = imagecreatefromjpeg("image.png");
$rotatedImage = imagerotate($destimg, 200, 0);
imagesavealpha($rotatedImage, true);
imagepng($rotatedImage,"rotated.png");