【问题标题】:Can a JPEG compressed image be rotated without a loss in quality?JPEG 压缩图像可以在不损失质量的情况下旋转吗?
【发布时间】:2009-02-12 21:35:09
【问题描述】:

JPEG 是一种有损压缩方案,因此解压缩-操作-再压缩通常会进一步降低每一步的图像质量。 是否可以旋转 JPEG 图像而不会造成进一步的损失?根据我对 JPEG 算法的了解,天真地似乎可以通过一点努力来避免进一步的损失。哪些常见的图像处理程序(例如 GIMP、Paint Shop Pro、Windows Photo Gallery)和图形库在执行旋转时会导致质量损失,哪些不会?

【问题讨论】:

    标签: graphics compression jpeg lossy-compression


    【解决方案1】:

    有一个名为 jpegtran 的程序

    jpegtran – 用于在不同 JPEG 格式之间进行无损转码的实用程序。

    要无损旋转图像,您可以执行以下操作:

    $ jpegtran -rotate 180 -perfect -outfile rotated.jpg origin.jpg
    

    还有Here is a list of applications which provide the JPEG lossless rotation feature based on the IJG code

    【讨论】:

    • 注意:对应的包在 ArchLinux 上命名为libjpeg-turbo
    • 警告:我现在还发现 jpegtran 实际上会失去质量。大小不能被 16 整除的 jpeg 可能会发生这种情况。欢迎知友发表评论。
    • @VasiliNovikov 手册页有详细信息。我没有使用旋转操作,但我知道对于裁剪操作,如果您选择沿压缩块边界的裁剪边界,它只会是无损的。可能对于尽可能无损的旋转,您首先需要沿边界裁剪部分块,然后旋转结果。
    • @Nobody -perfect 键要么使操作成功并进行无损旋转,要么根本不产生任何输出并失败。
    • 谢谢大佬,文件大小没有变化:)
    【解决方案2】:

    是的,在某些情况下是可能的:90 度旋转和翻转图像。 JPEG 算法的核心——有损部分——涉及将图像分解为 8x8 像素块,对块执行discrete cosine transform,然后量化结果。除此之外,还有一些色彩空间转换和块的无损压缩。

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

    1. 解压缩并提取块
    2. 转置和/或符号翻转每个块的 DCT 系数
    3. 将块重新排列成新的顺序(否则 8x8 块将被旋转但仍位于旧位置)
    4. 使用无损压缩步骤将其全部重新压缩。

    【讨论】:

    • 有这样的java库吗?
    • 所以要清楚的是(90° 旋转 + 翻转)尺寸为 8 倍数的图像,而不是 90° 旋转 +(翻转尺寸为 8 倍数的图像)?
    • @MarkFisher -- 是的,前者。仔细想想,如果有必要,必须对图像进行填充(例如,dsp.stackexchange.com/a/35343),以便它具有完整的 DCT 8x8 块。所以我误认为尺寸是 8 的倍数。
    • 您好@Boojum,请看this question,我认为您的输入将有助于就地JPEG图像旋转。
    【解决方案3】:

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

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

    【讨论】:

    • 您可以“手动”使用 jpeg 进行 90-180-270 无损转换。
    • 更改图片的 Exif 不会对数据本身产生任何影响,并且一些图片查看器不会很好地处理它。另外,如果你想修改图像,它会有点难玩,因为你必须考虑方向......
    • Qt 的 QImage/QPixmap 没有考虑 exif 方向字段。
    • 在上传到在线论坛或大多数网站时,通常会从照片中删除“EXIF 数据”,因为它可能会泄露敏感数据以跟踪一个人(例如坐标)。我认为没有浏览器支持根据 EXIF 数据读取图像。
    【解决方案4】:

    来自JPEG FAQ

    "有几个专门的 可以在 JPEG 上完成的操作 文件无需解压缩,并且 因此不会引起 你通常会经历的代际损失 从加载和重新保存中获取 常规图像编辑器中的图像。在 特别是可以做 90度旋转和翻转 无损,如果图像尺寸 是文件块的倍数 尺寸(通常为 16x16、16x8 或 8x8 彩色 JPEG 的像素)。
    ...

    但是您确实需要特殊的软件;在常规图像编辑器中旋转图像不会是无损的。”

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 360可行,但720需要更多技巧
      • 我已经打败了你们:我可以用我的思想将 JPEG 旋转 0 度。
      【解决方案6】:

      是的,这是可能的。
      快速谷歌搜索给出了这个程序列表which do this

      【讨论】:

      • 你知道有什么图书馆可以做到吗?
      【解决方案7】:

      如果您说的是旋转 JPEG 图像,那么就没有进一步的压缩了,对吧?这是关于旋转像素位置。

      使用任何程序进行旋转都可能会改变中间尺寸,因为它需要保留原始图像,这可能是一个需要考虑的问题。

      【讨论】:

        【解决方案8】:

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

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

        我建议你尝试压缩、操作和重新压缩,看看结果是否足够好。是否足够好取决于您的申请。

        【讨论】:

        • 打开再压缩,尤其是多次,肯定会导致质量变差。这是无损压缩的根本弱点。 (正如您所建议的那样,关心是否足够糟糕绝对是主观的。)
        【解决方案9】:

        根据 Sean McHugh 在Understanding Digital Image Interpolation 上的精彩文章:

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

        最终以

        结束

        尽可能避免旋转照片;如果一张不平整的照片 需要它,旋转不超过一次。

        【讨论】:

          【解决方案10】:

          如果有帮助的话:

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

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

          在简单的 90° 旋转后,它们都不会产生比基本 Windows 7 图片查看器更大的图片。 不可否认,这么快就结束了,但我暂时还没有找到真正的无损旋转 .jpeg 应用程序,无论如何也不比 Windows 内置的应用程序好。

          【讨论】:

            猜你喜欢
            • 2012-03-07
            • 2019-12-13
            • 1970-01-01
            • 2014-03-22
            • 1970-01-01
            • 1970-01-01
            • 2016-03-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多