【发布时间】: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 中做到这一点?
【问题讨论】: