2010-07-27 84 views
4

我需要旋转一些现有的JPG图像。他们已经失去了一些细节,但我现在想旋转它们,并没有进一步的细节。是否可以在PHP中对JPEG图像执行无损旋转?

通过一点研究,似乎PHP的唯一无损图像旋转库是通过使用jPegTran库。

有没有其他的选择,当它做一些无损JPG旋转?

谢谢!

+1

jpg本质上是有损的。也许尝试PNG? – 2010-07-27 12:00:30

+5

JPG的压缩有一个特殊的属性,允许无损旋转。图像的每个8x8单元格都可以通过可以旋转和重新排序的方式单独压缩。 – 2010-07-27 13:49:17

+3

@Talvi我认为在JPEG上无损旋转背后的想法是不会引入任何_more_损失。如果您只是简单地打开JPEG,旋转它并再次保存(进一步压缩图像),那么生成的图像将比您开始使用的图像有更多的损失。 – MrWhite 2010-07-27 13:56:26

回答

5

exec('commandline')将不可能调用外部程序losslessrotator;

另一种选择是jpegtran通过jpegclub

+0

我肯定会去这个; PHP非常慢(这包括它的图像操作库),你最好调用一个实际编译的程序。 – NullUserException 2010-07-27 12:20:55

+0

我对调用其他库没有任何问题。我会试试这个。只要它在Linux上工作。 – 2010-07-28 11:15:41

+0

在linux上,您可以使用http://linux.die.net/man/1/jpegtran – schoetbi 2010-07-29 08:30:23

0

你不能读取的字节数,只是这样做将其移动到合适的位置,以使它们旋转转型?

+0

不,你不能。你必须在位图上进行这种转换。 – NullUserException 2010-07-27 12:19:21

+0

JPG我猜是压缩的吗? – 2010-07-27 12:24:04

+0

是的。 JPG,GIF,PNG - 它们全部压缩。 – NullUserException 2010-07-27 12:28:35

-5

JPEG是一种有损格式,所以答案是否定的,您不能在任何应用程序,编程语言或大师冥想中创建JPEG无损旋转。

但是,如果将JPEG保存为JPEG格式,则可以通过在保存旋转的JPEG时使用$quality参数来最大程度地减少图像数据丢失。如果您将其保存为无损格式,那么您已经最大限度地减少了图像数据丢失。

例子:

$img = imagecreatefromjpeg($file); 
$rot = imagerotate($img, 90, 0); 
imagejpeg($rot, $output, 100); /* set quality to 100% */ 
+0

对不起,JPG已保存,所以已经丢失了一些细节。我现在想旋转有损图像,但没有进一步的细节 – 2010-07-28 11:16:17

+0

你会实现我的建议。如果你不需要输出为JPEG,你可以使用其他无损格式,如png:imagepng($ rot,$ output); – jmz 2010-07-28 16:39:15

1

要小心jpegtran旋转90度顺时针或逆时针时,预期也不会旋转,所有的像素,因为它只能在区域做losslless旋转,其尺寸是jpeg块大小的倍数(通常为8x8像素)。它会在内部旋转每个块内的像素以避免图像重新压缩,但边缘块不能像那样旋转。因此,使用jpegtran -rotate 90或270时,您将在边缘留下一小块未旋转的像素,并且您需要使用-trim选项来去除它们,但最终得到的图像将会缩小几个像素比原来。

所以,虽然它是一个无损的旋转,你仍然最终失去了过程中的一些像素。

+0

看起来'jpegtran'的新替代品是'exiftran',它也是EXIF可识别的(https://linux.die.net/man/1/exiftran)。我不知道它是否有同样的弱点? – TheStoryCoder 2017-12-08 13:09:32

+0

是的,它似乎有同样的弱点。这也使得它无法使用。为什么他们不能正确地做 - 因为我的* FastStone Image Viewer *可以做到这一点? – TheStoryCoder 2017-12-08 13:27:37