【问题标题】:php imagerotate() ruins alpha on png?php imagerotate()破坏了png上的alpha?
【发布时间】:2012-08-18 10:16:55
【问题描述】:

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

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

还有最后一个属性,比如:

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

新的空图像采样等...

没有骰子....

谁能帮忙?

【问题讨论】:

  • 在致电imagesavealpha之前尝试旋转它
  • 感谢@Musa 也尝试过......!
  • ignore_transparent(第 4 个参数)仅在 PHP 5.1 中添加。通过echo phpversion(); 检查您使用的 PHP 版本
  • 感谢@xconspirisist 很遗憾我已经看到那一点了.. 5.3 版

标签: php gd php-gd


【解决方案1】:

我之所以回答我的问题仅仅是因为我已经尝试了 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 小时......希望它会阻止其他人经历同样的痛苦......

【讨论】:

    【解决方案2】:

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

    imagerotate($pasteboard, 5, 255);
    

    我们得到以下图像

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

    使用 imagemagick 的转换来旋转相同的图像。命令,即$&gt; convert -rotate 5 image.png image_rotated.png 会产生下图

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

    如果您可以通过execprocess 使用convert 命令,则应将这些图像操作通过管道传递给imagemagick。 GD 是一个简单的图像库,最近几年没有更新太多。否则,请尝试 Imagemagick、Cairo 或 Gmagick,它们也有 pecl 插件http://php.net/manual/en/book.image.php

    最后,有人做了一个函数,它使用 GD http://www.exorithm.com/algorithm/view/rotate_image_alpha 来处理你所关心的事情,但结果并不漂亮,因为它是一个简单的线性插值:

    取自How to rotate an image in GD Image Library while keeping transparency?。也许如果将线性插值函数转换为 Bicubic 或 Quad 会更好看。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2018-10-25
        • 1970-01-01
        • 2015-04-19
        • 1970-01-01
        • 1970-01-01
        • 2013-11-27
        • 2015-07-22
        • 2017-04-25
        • 1970-01-01
        相关资源
        最近更新 更多