使用 FFmpeg 将一系列 JPEG 图像无损地合并到网格中

Merge a sequence of JPEG images into a grid losslessly with FFmpeg

我有一系列图像,它们是较大图像的块,它们一起构成了整个图像。这些块是沿均匀间隔的水平和垂直线分割原始图像的结果,因此它们没有奇怪的尺寸。

有没有办法在不重新编码图像的情况下将它们与 FFmpeg(或其他类似 ImageMagick 的东西)结合起来?

This answer建议使用hstackvstackFFmpeg滤镜,但我的图像块不一定是原始图像的全宽或全高。


像这样:

也许这可以通过使用 hstackvstack 的多个 FFmpeg 命令来实现(尽管我更喜欢一个命令)。或者使用复杂的过滤器?


例如


编辑:我尝试将 filter_complex 与 FFmpeg 一起使用:

ffmpeg -i 0.jpg -i 1.jpg -i 2.jpg -i 3.jpg -i 4.jpg -i 5.jpg \
-filter_complex "[0][1]hstack=inputs=2[row 0]; \
                 [2][3]hstack=inputs=2[row 1]; 
                 [4][5]hstack=inputs=2[row 2]; 
                 [row 0][row 1][row 2]vstack=inputs=3[out]" \
-map "[out]" -c copy out.jpg

但不能同时过滤和复制流

您可以使用 ImageMagick 做到这一点。但是,它会解压缩并重新压缩您的 jpg 文件。你会失去一些品质。

IM 6 的 Unix 语法:

convert \
\( 0.jpg 1.jpg +append \) \
\( 2.jpg 3.jpg +append \) \
\( 4.jpg 5.jpg +append \) \
-append \
mona_lisa.jpg


如果使用 Windows 从括号中删除 \ 并将行尾 \ 替换为 ^.

如果使用 IM 7,请将 convert 替换为 magick。

我发现了一个有趣的 patch from 2010 against libjpeg,它将此功能添加到 jpegtran。它不会拆分块,因此您的图像在每个轴上需要是 8 甚至 16 像素的倍数。

不幸的是,它反对为 ubuntu10 分发的 libjpeg 6b。这包括来自 8d 的一些补丁,并没有真正与任何官方 libjpeg 版本完全对应(据我所知)。

您需要下载 ubuntu10.04 源代码,提取它们的 libjpeg,然后对其进行修补。步骤是:

wget http://old-releases.ubuntu.com/releases/releases/10.04/release/source/ubuntu-10.04-src-1.iso

现在打开该 ISO 并从 ubuntu/pool/main/libj/libjpeg6b 中提取文件。 Archive Manager 可以做到这一点,也许还有一些可编写脚本的工具。

现在运行:

# original sources
tar xf libjpeg6b_6b.orig.tar.gz
cd jpeg-6b

# apply ubuntu patches
zcat ../libjpeg6b_6b-15ubuntu1.diff.gz | patch

# apply jpegtran patches
patch < ../append-jpeg6b.patch

./configure
make
sudo make install

这会将修改后的 jpegtran 安装到 /usr/local

给定 0.jpg1.jpg:

你可以运行这样:

jpegtran -appright 1.jpg 0.jpg > join.jpg

制作: