【问题标题】:jpegtran.exe not correctly rotating imagejpegtran.exe 无法正确旋转图像
【发布时间】:2013-01-30 20:13:45
【问题描述】:

我有一个新编译的 libjpeg 版本 9,并尝试在命令行中使用参数运行 jpegtran.exe:

.\jpegtran.exe -rotate 180 -outfile test_output1.jpg testimg.jpg

testimg.jpg:test_output1.jpg:

如您所见,它确实会旋转图像,但会剪切图像并且无法正确组合在一起。软件包附带的 usage.txt 文件并不是最新的,因为我不得不使用 -outfile 开关而不是它所说的:

jpegtran 使用类似于 cjpeg 或 djpeg 的命令行语法。在 类 Unix 系统,你说:

  • jpegtran [开关] [输入文件] >输出文件

在大多数非 Unix 系统上,您会说:

  • jpegtran [开关] 输入文件输出文件

输入和输出文件都是 JPEG 文件。

要指定输出文件中使用的编码 JPEG 表示, jpegtran 接受 cjpeg 识别的开关子集:

  • -optimize 执行熵编码参数的优化。
  • -progressive 创建渐进式 JPEG 文件。
  • -arithmetic 使用算术编码。
  • -restart N 每 N MCU 行或每 N MCU 块发出一个 JPEG 重启标记,如果数字附加了“B”。
  • -scans file 使用指定文本文件中给出的扫描脚本。

有关这些的更多详细信息,请参阅之前对 cjpeg 的讨论 开关。如果你没有指定这些开关,你会得到一个普通的 基线JPEG输出文件。质量设置等是 由输入文件决定。

图像可以通过提供其中之一进行无损转换 开关:

  • -水平翻转 水平镜像(左右)。
  • -flip vertical 垂直镜像(上下)。
  • -rotate 90 将图像顺时针旋转 90 度。
  • -rotate 180 将图像旋转 180 度。
  • -rotate 270 将图像顺时针旋转 270 度(或 90 ccw)。
  • -transpose 转置图像(跨 UL 到 LR 轴)。
  • -transverse Transverse transpose(跨 UR 到 LL 轴)。

奇怪的是(或者可能不是),如果我执行.\jpegtran.exe -rotate 180 -outfile test_output2.jpg test_output1.jpg,我会得到原始图像而不会出现任何剪切问题。它正在翻转剪裁的部分,但只是没有将其与图像的其余部分对齐。

test_output2.jpg:

我通过执行两次jpegtran.exe -rotate 90 得到相同的结果。

另外,我在一个更大的 .jpg 文件上进行了尝试,这导致了同样的问题,但输出的文件大小小了 18KB。我想这个问题与此有关。


编辑 - 我还发现了这个似乎描述问题的简介:

jpegtran 在转换奇数大小图像时的默认行为是 旨在保持精确的可逆性和数学一致性 的变换集。如前所述,转置能够翻转 整个图像区域。水平镜像留下任何部分 iMCU 右边缘的列保持不变,但能够翻转所有行 图片。同样,垂直镜像会留下任何部分 iMCU 行 在底部边缘未触及,但能够翻转所有列。这 其他变换可以构建为转置和翻转序列 操作;为了一致性,定义了它们对边缘像素的动作 与相应的最终结果相同 转置翻转序列。

-trim 开关起作用,如果你可以这样称呼它,它会修剪掉杂乱无章的数据,但图像会更小并丢失数据。

test_output5.jpg:

添加 -perfect 开关据说可以阻止上述情况的发生,结果如下:transformation is not perfect 用于输出且无图像。

那么就不能无损地旋转 .jpg 文件吗?我自己可以通过简单地将边缘线移动到正确的位置来进行绘画并重建原始图像。有没有办法在 libjpeg 中做到这一点?

【问题讨论】:

    标签: c++ jpeg libjpeg


    【解决方案1】:

    无损旋转适用于 JPEG 文件中包含的整个 DCT 块。这些块始终为 8x8 或 16x16 像素(取决于压缩downsampling 设置)。该文件包含宽度和高度,因此在解码图像时可以丢弃额外的像素,但无法将剪辑从右/下边缘移动到左/上边缘。该软件正在尽其所能解决一个不可能的问题。

    正如您发现的那样,解决此问题的方法是使宽度和高度能被 16 整除。您会发现例如来自相机的图像将具有此属性。

    【讨论】:

    • 所以它说它旨在保持数学可逆性。有没有办法以某种方式忽略这个指令?甚至以一种有损的方式?我将尝试使用一些图像来尝试 /16。我想我正在使用的 IP cam 将具有正确的 /16 分辨率。
    • @Enigma,我对 jpegtran 不够熟悉,不知道是否有除无损之外的旋转方式。即使可以,您现在仍然需要选择质量设置,这对于无损操作来说不是问题。
    • 我觉得很幽默,libjpeg 附带的提供的 testimg 不能被 16 整除,但我尝试了 /16 WxH 图像,它工作得很好,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2011-10-21
    • 2019-03-29
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多