3

我一直在抨击一些简单的事情。

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

给了我这个:

在此处输入图像描述

万岁!

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

可悲的是,这给了我这个:

在此处输入图像描述

嘘!

我尝试将颜色设置为:

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

还有最后一个attr,例如:

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

新的空图像采样等...

没有骰子....

任何人都可以帮忙吗?

4

3 回答 3

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):

在此处输入图像描述

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

于 2012-08-23T02:46:58.687 回答
2

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

imagerotate($pasteboard, 5, 255);

我们得到以下图像

使用蓝色作为第三个参数旋转

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

使用 imagemagick 的转换来旋转相同的图像。命令ie$> convert -rotate 5 image.png image_rotated.png结果如下图

使用 imagemagick 旋转

Clearly GD does not handle alpha colors well when rotating.

If you have access to use the convert commmand using exec or process, you should pipe those image operation to imagemagick instead. GD is a simple image library which has not been updated much the latest years. Otherwise try Imagemagick, Cairo or Gmagick which there are pecl plugins for too http://php.net/manual/en/book.image.php.

Last resort somebody made a function that which uses GD http://www.exorithm.com/algorithm/view/rotate_image_alpha for what you are looking after but the result is not pretty since its a simple linear interpolation:

线性插值

taken from How to rotate an image in GD Image Library while keeping transparency?. Perhaps if you convert the linear interpolation function to a Bicubic or Quad it will look better.

于 2012-08-23T00:04:59.773 回答
0

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

$destimg = imagecreatefromjpeg("image.png");
$rotatedImage = imagerotate($destimg, 200, 0);
imagesavealpha($rotatedImage, true);
imagepng($rotatedImage,"rotated.png");
于 2016-01-21T09:07:46.763 回答