使用jpegtran合并不同大小的JPEG文件

4
我已经成功地使用jpegtran按照这个stackoverflow答案中的方法合并了大小相同(512x512)的JPEG图像:https://dev59.com/WGsz5IYBdhLWcg3wWmYy#29615714 这些是从互联网上下载的平铺式JPEG图像,当它们被组合在一起时可以形成一个360度全景。正如我所说,512x512的图像通过jpegtran完美地组合在一起;然而,我意识到其中一些用于组成全景的图块为256x256,需要在与其他图块组合以形成全景时将其大小加倍(在等距投影的二维形式中)。
简单来说,我想知道jpegtran是否可以无损地合并两个不同尺寸的JPEG图像,例如,我是否可以无损地将256x256的图块的分辨率加倍,然后将其与另一个512x512的图块组合在一起。
我知道这可以通过重新编码来完成,但我想知道是否可以完全无损地完成。谢谢。
1个回答

0

目前还不行。我们需要以下几点:

  1. 无损裁剪 - 长期支持
  2. 智能缩放 - 注意,这不符合ITU JPEG标准,会改变宏块的像素大小,并且在许多解码器上会失败。
  3. 能够在文件的中途更改宏块大小。我猜测智能缩放不支持这一点,但一些较新的图像/视频压缩格式可能支持。
  4. 支持的软件 - 目前还没有可用的。我测试了目前最新的JPEG-9e版本,它不能附加具有不同SmartScale比例/宏块大小的JPEG图像。

考虑到jpegtran的-crop、-scale和-drop操作不能组合使用,我想出了以下解决方案:

#start with two images
#512x512.jpg - 64x64 macroblocks
#256x256.jpg - 32x32 macroblocks

#uncrop 2x1x using libjpeg7+ to give us space for later.
#out.jpg resolution is 1024x512, 128x64 macroblocks
jpegtran -crop 1024x512+0+0 -outfile out.jpg 512x512.jpg

#upscale the 256px image to 512x512 using libjpeg8+'s SmartScale
#Note: Does not change image width/height in macroblocks!
#Note: Only changes width/height of macroblocks!
#upscale.jpg is 512x512 but still 32x32 macroblocks
jpegtran -scale 8/4 -outfile upscale.jpg 256x256.jpg

#drop in upscale.jpg on the right half of the output image.
jpegtran -drop +512+0 upscale.jpg -outfile out.jpg out.jpg

然而,最后一个命令失败了,显示"Bogus virtual array access",这是jpeg-9e/jmemmgr.c第857行抛出的JERR_BAD_VIRTUAL_ACCESS错误的字符串。

它失败的原因是end_row > ptr->rows_in_array,其中rows_in_array是32个宏块,而end_row达到33个宏块——不在upscale.jpg中的第一个宏块行。

jpegtran期望一个512x512像素的图像使用目标图像宏块大小为64x64宏块,因此在upscale.jpg的一半时,它用完了源宏块并走到了图像的末尾。如果我们修补libjpeg以使用正确的宏块大小,我们需要某种方式将宏块大小的更改编码到文件中,但我不确定该如何实现。


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