使用 FFmpeg 将一系列 JPEG 图像无损地合并到网格中
Merge a sequence of JPEG images into a grid losslessly with FFmpeg
我有一系列图像,它们是较大图像的块,它们一起构成了整个图像。这些块是沿均匀间隔的水平和垂直线分割原始图像的结果,因此它们没有奇怪的尺寸。
有没有办法在不重新编码图像的情况下将它们与 FFmpeg(或其他类似 ImageMagick 的东西)结合起来?
This answer建议使用hstack
或vstack
FFmpeg滤镜,但我的图像块不一定是原始图像的全宽或全高。
像这样:
也许这可以通过使用 hstack
或 vstack
的多个 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.jpg
和 1.jpg
:
你可以运行这样:
jpegtran -appright 1.jpg 0.jpg > join.jpg
制作:
我有一系列图像,它们是较大图像的块,它们一起构成了整个图像。这些块是沿均匀间隔的水平和垂直线分割原始图像的结果,因此它们没有奇怪的尺寸。
有没有办法在不重新编码图像的情况下将它们与 FFmpeg(或其他类似 ImageMagick 的东西)结合起来?
This answer建议使用hstack
或vstack
FFmpeg滤镜,但我的图像块不一定是原始图像的全宽或全高。
像这样:
也许这可以通过使用 hstack
或 vstack
的多个 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.jpg
和 1.jpg
:
你可以运行这样:
jpegtran -appright 1.jpg 0.jpg > join.jpg
制作: