Как совместить 2 изображения с ffmpeg? - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть 2 изображения, которые я хотел бы поместить одно поверх другого.Я сделал эту строку:

ffmpeg -i "C:\image_1.jpg" -i "C:\image_2.jpg" -q:v 1 -filter_complex "[0:v]scale=800:-1[v0];[v0][1:v]vstack" C:\combined.jpg

, и она работает, когда они имеют одинаковое разрешение 800x800 и когда разрешение первого меньше image_2.

Можно ли добавитьнемного математики вместо 800, чтобы сделать эту линию подходящей для любого типа разрешений, когда первый больше или второй больше (ширина и высота отдельно)?

Я хочу найти максимальный размер и масштабировать другое изображениек нему сохраняются пропорции.Если соотношение сторон двух изображений не одинаковое, заполните отверстия простым белым (255 255 255).

Полагаю, математика должна выглядеть следующим образом:

w1, h1 - width and height of the 1st img
w2, h2 - width and height of the 2st img
w1', h1', w2', h2' - width and height of resulted images

if w1 max{w1, h1, w2, h2} -> if w2/h2>=1 -> w2'=w1; h2'=h2*w2'/w2
if w1 max{w1, h1, w2, h2} -> if w2/h2<1  -> h2'=w1; w2'=w2*h2'/h2

if h1 max{w1, h1, w2, h2} -> if w2/h2>=1 -> w2'=h1; h2'=h2*w2'/w2
if h1 max{w1, h1, w2, h2} -> if w2/h2<1  -> h2'=h1; w2'=w2*h2'/h2

if w2 max{w1, h1, w2, h2} -> if w1/h1>=1 -> w1'=w2; h1'=h1*w1'/w1
if w2 max{w1, h1, w2, h2} -> if w1/h1<1  -> h1'=w2; w1'=w1*h1'/h1

if h2 max{w1, h1, w2, h2} -> if w1/h1>=1 -> w1'=h2; h1'=h1*w1'/w1
if h2 max{w1, h1, w2, h2} -> if w1/h1<1  -> h1'=h2; w1'=w1*h1'/h1

Пример 1 Пример 2

Если два изображения i1 и i2 имеют размеры 800x800 и - 436x800 соответственно: объединенное изображение будет 800x1600.

Если два изображения i1 иi2 составляют 300x400 и 200x500 соответственно: макс. (300 400 200 500) = 500;300x400 -> (300 * 500/400 = 375) x500;200x500 -> 200x500.Выровняйте самый маленький (200x500) по центру, заполните пробелы (2 пробела: (375-200) / 2 = 88) белым (255,255,255).

1 Ответ

0 голосов
/ 27 сентября 2018

Использовать

ffmpeg -i image_0.jpg -i image_1.jpg -filter_complex
       "sws_flags=bicubic;
        color=c=white:4x4,format=yuvj444p,trim=end_frame=1,split=2[c0][c1];
        [0][1]scale2ref='if(gte(max(main_w,main_h),max(iw,ih)),main_w,if(gte(main_w,main_h),iw,oh*mdar))':
                        'if(gte(max(main_w,main_h),max(iw,ih)),main_h,if(gte(main_w,main_h),ow/mdar,ih))'[0max][1ref];
        [1ref][0max]scale2ref='if(gte(max(main_w,main_h),max(iw,ih)),main_w,if(gte(main_w,main_h),iw,oh*mdar))':
                        'if(gte(max(main_w,main_h),max(iw,ih)),main_h,if(gte(main_w,main_h),ow/mdar,ih))'[1max][0max];
        [c0][0max]scale2ref[c0max][0max];[c1][1max]scale2ref[c1max][1max];[c0max][c1max]scale2ref='if(gte(main_w,iw),main_w,iw)':main_h[c0max][c1max];
        [c1max][c0max]scale2ref='if(gte(main_w,iw),main_w,iw)':main_h[c1max][c0max];
        [c0max][0max]overlay=format=auto:x=(W-w)/2:y=(H-h)/2[0f];[c1max][1max]overlay=format=auto:x=(W-w)/2:y=(H-h)/2[1f];
        [0f][1f]vstack,setsar=1"  out.jpg

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


Старый ответ

Вам нужно будет использовать фильтр scale2ref , дважды.

ffmpeg -i image1 -i image2 -filter_complex
       "[0][1]scale2ref=w='max(iw,main_w)':h=ow/mdar[0max][1ref];
        [1ref][0max]scale2ref=w='max(iw,main_w)':h=ow/mdar[1max][0max];
        [0max][1max]vstack" -q:v 1 combined.jpg
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...