php imagerotate()破坏png上的alpha?

php imagerotate()破坏png上的alpha?,php,gd,php-gd,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"]

我一直在用一些简单的东西猛击我的头

// ....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);
新的空图像采样等

没有骰子


有人能帮忙吗?

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

imagerotate($pasteboard, 5, 255);
我们得到下面的图像

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

使用“转化为imagemagick”旋转的同一图像。命令,即
$>转换-rotate 5 image.png image\u rotated.png
生成下图

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

如果您有权使用
convert
命令并使用
exec
process
,则应将这些图像操作传输到imagemagick。GD是一个简单的图像库,最近几年没有更新太多。否则,试试Imagemagick、Cairo或Gmagick,它们也有pecl插件

最后一种方法是,有人制作了一个函数,它使用GD进行处理,但结果并不理想,因为它是一个简单的线性插值:


摘自。也许如果你把线性插值函数转换成双三次或四次插值函数,它看起来会更好。

我回答我的问题仅仅是因为我尝试了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);
//旋转它

$pasteboard=imagerotate($pasteboard,5,0XFFFFFF00,0)// 注意,这些答案对我来说并不适用,但这确实适用

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

在调用
imagesavealpha
Thank@Musa之前,请尝试旋转它。。!ignore_transparent(第4个参数)仅在PHP5.1中添加。使用
echo phpversion()检查您使用的PHP版本谢谢@xconspirist遗憾的是我已经看到了这一点。。第5.3版