Объедините последовательность изображений JPEG в сетку без потерь с помощью FFmpeg - PullRequest
2 голосов
/ 20 января 2020

У меня есть последовательность изображений, которые являются блоками большего изображения, которые вместе составляют целое изображение. Блоки являются результатом разделения исходного изображения по равномерно расположенным горизонтальным и вертикальным линиям, поэтому они не имеют странных размеров.

Есть ли способ объединить их с FFmpeg (или чем-то еще, например ImageMagick) без перекодировать изображения?

В этом ответе предлагается фильтр hstack или vstack FFmpeg, но мои блоки изображений не обязательно имеют полную ширину или полную высоту оригинала. image.


Примерно так:

Six blocks of differing sizes in a 3-row, 2-column grid

Возможно, этого можно достичь с помощью нескольких команд FFmpeg, используя hstack или vstack (я бы предпочитаю только одну команду, хотя). Или со сложным фильтром?


например Mona Lisa split into six distinct blocks, then arranged together


Редактировать: я пытался использовать 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

, но это не может фильтровать и копировать потоки одновременно.

Ответы [ 2 ]

1 голос
/ 20 января 2020

Я нашел интересный патч 2010 года против libjpeg , который добавляет эту функцию в jpegtran. Он не будет разбивать блоки, поэтому ваши изображения должны быть кратны 8 или даже 16 пикселям по каждой оси.

К сожалению, это против libjpeg 6b, распространяемого для ubuntu10. Это включает некоторые патчи из 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. Менеджер архивов может сделать это, возможно, есть какой-то инструмент для работы со сценариями.

Теперь запустите:

# 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:

enter image description here

Вы можете запустить его так:

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

Чтобы сделать:

enter image description here

1 голос
/ 20 января 2020

Вы можете сделать это с помощью ImageMagick. Тем не менее, он будет распаковывать и повторно сжимать ваши файлы JPG. Вы потеряете качество.

Unix Синтаксис для IM 6:

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


При использовании Windows удалите \ из скобок и замените конец строки \ с ^.

Если используется IM 7, замените конвертацию магией.

...