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 回答 4

4

在我们的共享服务中,我们以不同的方式处理这个问题。我们始终保留原始图像并存储初始旋转 (0)。

旋转时,加载原始图像,根据旋转 +/- 90 度旋转,并将副本写入文件系统。之后,使用新的轮换更新数据库。

不过,您的数据库中还需要两列,用于旋转和旋转的复制位置。我还假设您总是进行初始调整大小(可能针对不同大小进行多次调整),以便额外的列始终指向副本,而不是有时指向原始列直到旋转。

于 2012-07-04T15:19:46.953 回答
3

如果您在有限矩阵中旋转图像,则无法避免质量、服务器端或客户端的下降,并且这些下降会在每次旋转时添加。

如果您需要来自同一个图像的多个旋转图像,则必须始终使用第一个(从未旋转过的)图像作为源并增加角度,而不是旋转最后一个旋转图像。

于 2012-07-04T15:16:28.593 回答
1

每次保存 JPG 时,质量都会下降。这是一种“有损”格式。如果您使用 PNG,您可以在零质量损失的情况下旋转任意多次,因为它是一种“无损”格式。

于 2012-07-04T15:20:51.773 回答
1

几点

  • 正如dystroy所写,在压缩图像上使用时旋转是有损的
  • 客户端旋转通常不是图像操作,而是视图中图像对象的旋转,因此当您将其发送到服务器时,它将是原始图像
  • 传闻 ImageMagick 在转换上提供比 GD 更好的结果(参见http://de.php.net/imagick
于 2012-07-04T15:30:21.123 回答