PHP 图像旋转每次旋转后会失去质量。

6

我目前正在使用GD库和一些PHP代码来旋转图片。每次旋转后,图片的质量都会变差。是否有更好的方法来实现旋转图片,或者这是正常现象?

    $img = new ImageClass;
    list($original, $info) = $img->load($src);

    // Determine angle
    $angle = strtolower($angle);
    if( $angle == 'cw' || $angle == 'clockwise' ) $angle = 270;
    if( $angle == 'ccw' || $angle == 'counterclockwise' ) $angle = 90;

    $rgb = $img->hex2rgb($bg_color);
    $bg_color = imagecolorallocate($original, $rgb['r'], $rgb['g'], $rgb['b']);

    $new = imagerotate($original, $angle, $bg_color);

是否可以使用jQuery等客户端技术旋转图像,然后通过PHP将图像保存到服务器?我假设这样做会提高图像质量。

4个回答

4
在我们的分享服务中,我们处理这个问题有所不同。我们始终保留原始图像并存储初始旋转(0)。
当进行旋转时,将加载原始图像,根据旋转+/- 90旋转,然后将副本写入文件系统。之后,更新数据库以反映新的旋转。
您需要在数据库中添加两列,分别用于存储旋转和旋转后的副本位置。我还假设您总是进行初始调整大小(可能是多个不同尺寸),因此额外的列始终指向副本,而不是有时指向原始图像再进行旋转。

3

如果你在有限的矩阵中旋转图像,就无法避免服务器或客户端的质量降低,每次旋转都会添加这些降级。

如果你需要从同一张图片中得到很多旋转后的图像,你必须始终使用第一张(未旋转)的图片作为源,并增加旋转角度而不是旋转最后一张旋转过的图片。


实际上,当图像通过JS或CSS在客户端旋转时,浏览器基本上会执行Jack在他的答案中描述的操作。因此,您可以将图像重新旋转多次,或者只是让它持续旋转而不必担心每次旋转都会降低其质量。 - Lèse majesté
有没有建议的客户端脚本可以做这种事情? - Paul

1
每次保存JPG格式的图片时,都会失去一定的质量。这是一种“有损”格式。如果您使用PNG格式,则可以无限次旋转而不会失去任何质量,因为它是一种“无损”格式。

1
不是这样的。保存为JPEG格式会导致质量损失,但是在没有某些特殊情况下,你无法旋转图像而不损失质量。 - Denys Séguret

1

几个要点

  • 正如dystroy所写,对于压缩图像,旋转会导致损失。
  • 客户端旋转通常不是图像处理,而是视图中图像对象的旋转,因此当您将其发送到服务器时,它将是原始图像。
  • 据传ImageMagick在变换方面比GD提供更好的结果(请参见http://de.php.net/imagick)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接