一个经过JPEG压缩的图片能够旋转而不损失质量吗?

31

JPEG是一种有损压缩方案,因此解压缩-操作-再压缩通常会在每个步骤中进一步降低图像质量。 是否可能在不产生进一步损失的情况下旋转JPEG图像? 根据我对JPEG算法的了解,似乎可以通过一些努力避免进一步的质量损失。哪些常见的图像操作程序(例如GIMP、Paint Shop Pro、Windows照片库)和图形库在执行旋转时会导致质量损失,哪些不会?


请参阅如何无损旋转照片? - undefined
10个回答

23

1
注意:在ArchLinux上,相应的软件包名为“libjpeg-turbo”。 - VasiliNovikov
3
警告:我现在发现 jpegtran 实际上也可能会损失质量。这可能发生在大小不是16的倍数的jpeg格式图片上。欢迎有相关知识的人员评论。 - VasiliNovikov
@VasiliNovikov 手册页面有详细信息。我没有使用过旋转操作,但我知道对于裁剪操作,只有在您选择沿压缩块边界选择裁剪边界时才会无损。可能对于尽可能无损的旋转,您需要先沿边界裁剪部分块,然后旋转结果。 - Nobody
@Nobody,“-perfect”关键字要么使操作成功并产生无损旋转,要么根本不会产生任何输出而失败。 - VasiliNovikov
谢谢,伙计。甚至文件大小也没有改变 :) - danday74

15
是的,对于某些情况,比如对图像进行90度旋转和翻转是可能的。JPEG算法的核心部分——有损部分——涉及将图像分成8x8像素块,在块上执行离散余弦变换,然后量化结果。此外,还有一些颜色空间转换和对块的无损压缩。

旋转或翻转8x8块将产生具有相同基本系数的DCT,但可能会根据变换而转置和/或带有一些符号变化。因此,无损旋转或翻转图像的基本步骤包括:

  1. 解压缩并提取块
  2. 对每个块的DCT系数进行转置和/或符号反转
  3. 重新排列块以其新顺序(否则8x8块将被旋转但仍在原来的位置)
  4. 使用无损压缩步骤重新压缩所有内容。

2
有没有一个Java库可以做到这一点? - android developer
所以,只是为了明确起见,这是对于尺寸为8的倍数的图像进行(90°旋转+翻转),而不是在尺寸为8的倍数的图像上进行90°旋转+(翻转)? - Mark Fisher
1
@MarkFisher -- 是的,前者。不过想一想,如果需要进行DCT,图像必须进行填充(例如:https://dsp.stackexchange.com/a/35343),以确保具有完整的8x8块。所以我之前关于尺寸必须是8的倍数的说法是错误的。 - Boojum
你好 @Boojum,能否请您看一下这个问题,我认为您的意见对于原地旋转JPEG图像会很有帮助。 - Aasim

13

完全可以-只需更改EXIF数据中的方向值。绝大多数图像程序将尊重此设置并显示“旋转”的图片。

如果满足某些条件,还可以以无损方式“手动”(例如编程方式)旋转图像-旋转必须是90/180度,并且宽度/高度必须是块大小的倍数。您还可以翻转/镜像它。不过,我不知道图像程序是否足够聪明以特殊情况处理此操作。我猜不能。


你可以使用JPEG手动进行90-180-270无损转换。 - xpda
3
修改图像的Exif信息不会对数据本身产生任何影响,而且一些图像查看器可能无法正确处理它。此外,如果您希望修改图像,则稍微有些难以操作,因为您需要考虑方向。 - android developer
Qt的“QImage” /“QPixmap”不考虑exif方向字段。 - Gabriel
在上传照片到在线论坛或大多数网站时,通常会剥离照片中的“EXIF数据”,因为它可能泄露敏感数据以跟踪一个人(例如坐标)。我认为没有浏览器支持根据EXIF数据读取图像。 - tripulse

10

来自JPEG FAQ

“有一些特殊操作可以在不解压缩JPEG文件的情况下进行,因此可以避免使用常规图像编辑器加载和重新保存图像时会发生的世代损失。特别是如果图像尺寸是文件块大小的倍数(通常为16x16、16x8或8x8像素),则可以无损地进行90度旋转和翻转彩色JPEG。但您需要特殊软件;在普通图像编辑器中旋转图像将不是无损的。”


2

虽然我不是jpg专家,但似乎对于90度、180度、270度旋转,答案是肯定的。(甚至可能还有360度!:))


8
360 可以完成,但 720 需要更高的技巧。 - Javier
3
我比你们都厉害:我可以仅凭思维将一张JPEG图片旋转0度。 - MusiGenesis

2
可以的。一个快速的谷歌搜索给出了这个程序列表,可以实现无损压缩:这里

你知道有没有任何库可以做到这一点吗? - android developer

0
根据Sean McHugh的理解数字图像插值的优秀文章:

每次旋转或扭曲图像时,也会发生插值。(...) 90°旋转是无损的,因为没有像素需要重新定位到两个像素之间的边界(因此被分割)。

最终得出结论:

尽可能避免旋转照片;如果一张不平衡的照片需要旋转,则最多旋转一次。


0

如果有帮助:

为了比微软(Windows 7)本地图片查看器及其右键旋转选项更好,我尝试了以下链接中的几个应用程序:http://jpegclub.org/losslessapps.html

例如,我尝试了FastStone Image Viewer、XnView、Photosurfer、JPEG Lossless Rotator和ExifPro Image Viewer。

在简单的90度旋转后,它们中没有一个能产生比基本的Windows 7图片查看器更大的图片。 虽然这样得出结论有些片面,但我仍然没有找到一个真正无损旋转.jpeg文件的应用程序,无论如何都不比内置的Windows应用程序更好。


0

除非您旋转90度的倍数,否则您的图像将需要执行某种插值,这可能会降低图像的质量。使用良好的插值算法将有所帮助。

至于打开和重新压缩,我不确定您是否会得到更差的质量,但我也不确定JPEG的工作原理。

我建议您尝试压缩、操作和重新压缩,并自行判断结果是否足够好。什么是足够好取决于您的应用程序。


1
打开和重新压缩,尤其是多次操作,肯定会导致更差的质量。这是无损压缩的一个根本性弱点。(是否糟糕到值得关注,正如您所建议的那样,肯定是主观的。) - John Melville

-1
如果你在谈论旋转JPEG图像,那么就不会再有进一步的压缩了。这是关于旋转像素位置的。
使用任何程序进行旋转都可能改变中间尺寸,因为它需要保留原始图像,这可能是需要考虑的问题。

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