无损图像旋转PHP

我一直在研究一个系统来旋转上传的图像。 该算法的工作原理如下:

 1) User uploads a jpeg.  It gets saved as a PNG
 2) Link to the temp png is returned to the user.
 3) The user can click 90left,90right, or type in N degrees to rotate
 4) The png is opened using 

   $image = imagecreatefrompng("./fileHERE");

 5) The png is rotated using

   $imageRotated = imagerotate($image,$degrees,0);

 6) The png is saved and the link returned to the user.
 7) If the user wishes to rotate more go back to step 3 operating on the newly
    saved temporary PNG, 
    else the changes are commited and the final image is saved as a jpeg.

当左右旋转90度时,这个效果非常好。 用户可以多次旋转无限,而不会有任何质量损失。 问题是,当用户试图旋转20度(或其他90倍的非倍数)。 旋转20度时,图像会稍微旋转,并形成一个黑色框以填充需要填充的区域。 由于图像(黑框)保存为PNG,下一次旋转20度会使图像(黑框)再旋转20度,并形成另一个黑盒来消除松弛。 长话短说,如果你这样做到360度,你会有一个很大的黑盒子在一个非常小的剩余图像周围。 即使您放大并剪出黑匣子,质量也会明显下降。

任何方式我可以避开黑匣子? (服务器没有安装imagick)


始终将源文件保存为未修改,并在旋转时使用原始源文件旋转度数。 所以20度+20度,意味着旋转源40度。

  • 用户上传JPEG。
  • 用户可以点击“90左”,“90右”或输入N度进行旋转。
  • png是使用打开的

    $image = imagecreatefromjpeg("./source.jpg");
    
  • PNG旋转...

    // If this is the first time, there is no rotation data, set it up
    if(!isset($_SESSION["degrees"])) $_SESSION["degrees"] = 0;
    
    // Apply the new rotation
    $_SESSION["degrees"] += $degrees;
    
    // Rotate the image
    $rotated = imagerotate($image, $_SESSION["degrees"], 0);
    
    // Save the image, DO NOT MODIFY THE SOURCE FILE!
    imagejpeg($rotated, "./last.jpg");
    
    // Output the image
    header("Content-Type: image/jpeg");
    imagejpeg($rotated);
    
  • 如果用户希望旋转更多地返回到步骤3,否则last.jpg被视为final并且$_SESSION["degrees"]参数被销毁。

  • 链接地址: http://www.djcxy.com/p/61145.html

    上一篇: Lossless image rotate PHP

    下一篇: How to rotate image repetitively in php without increasing its file size