如何在不截断部分 MCU 的情况下实现无损 JPEG 连接?

如何在不截断部分 MCU 的情况下实现无损 JPEG 连接?

我正在做一个项目,需要合并数千张 JPEG 图像无损(我在这里不谈论无损 JPEG/JPEG 2000/JPEG-LS 格式)。

上述图像的色度子采样级别各不相同(1x1、1x2、2x1、2x2),因此 MCU 大小也各不相同(8x8、8x16、16x8、16x16 像素)。但是,在要拼接的任何一组给定图像中,每幅图像都具有相同的特征。

现在,我们假设我只有 2 张图片。图片 #1 (I1) 尺寸为 256x256px,#2 (I2) 尺寸为 239x256px。采用 2x2 子采样,使得 MCU 尺寸为 16x16px。I2因此显然部分 MCU在右边缘,因为它的宽度不能被 16 整除。(我读过所谓的“部分” MCU 实际上包含完整 MCU 的数据,但图像尺寸指示渲染器仅显示相关像素并忽略/隐藏多余的像素。)

在寻找可以帮助我实现这一目标的工具时,我偶然发现了一个修改版JPEG转换,其中包含一个实验性的无损裁剪和拖放(剪切和粘贴)功能。我遇到的所有其他支持无损 JPEG 编辑的应用程序似乎都使用了 IJG(JpegTran)代码,因此这似乎是合乎逻辑的选择。此外,考虑到图像数量之多,我希望最好能从命令行运行某个程序,以便我可以使用脚本自动执行该过程。

不幸的是,虽然其他一切都运行良好,但 JpegTran 似乎截断了部分 MCU,而不是保留它们。因此在上面的例子中,最终合并的图像包含所有I1,但只有 224x256px 的I2。为什么是 224?因为 239 = 14x16+15,这意味着宽度上有 14 个完整的 MCU,还有 1 个部分 MCU(距离完整的 16px 仅差 1px)。最后的 15px 是被遮盖的,导致 495x256px 图像的右边缘有 15px 的空白(灰色)像素。参见下面的图片(可惜 imgur 重新压缩了它们):

图片 1(左)+ 图片 2(右)

=图片 1+2

您可以清楚看到,红色部分(15px)I2已被 JpegTran 截断。如果 MCU 的宽度为 8px,则丢失的部分将是I2. 同样,加入I3(256x239px)*以下*I1会导致损失 7 或 15px,当然这取决于 MCU 的高度:

图片 1(顶部)+ 图片 3(底部)

=图片 1+3

  • 我尝试做的事情能做到吗,或者所谓的“无损” JPEG 裁剪和删除只对没有部分 MCU 的图像有效?(也许这就是为什么该功能在推出十多年后仍处于“实验状态”的原因……)

  • 直到我知道一定这是不可能的,我不是对有损连接的建议感兴趣。避免任何发电损失无论如何,这是我为此绞尽脑汁的唯一原因,否则我早就把这件事解决了。而且,我不是对切​​换图像格式的建议感兴趣。我无法控制图像的来源。

  • 如果可以做到,怎么做?请记住,考虑到上述要求,任何建议的替代应用程序都必须能够实现自动化。(但考虑到我不太可能在有限制的情况下得到有用的答案,只要它实际上有效。我以后总是可以查看 AutoIT/AHK 脚本或其他东西来实现自动化。)

  • 我理解最终图像尺寸不规则可能会导致问题,因此我完全准备接受任何解决方案,即使它会导致右侧/底部出现空白(最好是黑色)填充像素。我的意思是,我不在乎I1+I2是496x256px(1px 填充)甚至 512x256px(17px 填充)大小,只要最终图像包含两个源图像的所有实际图像数据,并且整个过程无损。显然,填充(如果有)越少越好,但此时任何解决方案就可以了。

  • 基于 Windows 的解决方案是完美的,但基于 Linux 的解决方案也完全可以接受(如果可能的话,使用没有外部依赖关系的预编译二进制文件,而不仅仅是代码片段)。另外,请使用免费软件,除非只有付费软件才能解决问题。

答案1

JpegTran 现已由其开发人员更新,并且边缘截断错误已得到修复,因此不需要其他应用程序来完成我的任务。

相关内容