如何将2张图片与ffmpeg合并?

时间:2018-09-27 18:13:18

标签: ffmpeg

我有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

Example 1 Example 2

如果两个图像i1和i2分别为800x800和-436x800,分别为: 合并后的图片将为800x1600。

如果两个图像i1和i2分别为300x400和200x500: 最大(300,400,200,500)= 500; 300x400->(300 * 500/400 = 375)x500; 200x500-> 200x500。将最小的一个(200x500)对准中心,并用白色(255,255,255)填充间隙(2个间隙:(375-200)/ 2 = 88)。

1 个答案:

答案 0 :(得分:1)

使用

index.routing.allocation.disable_allocation

这将按比例缩小较小尺寸的图像,以匹配两个输入的最大尺寸。然后将调整大小后的图像叠加在相同宽度的画布上,最后堆叠起来。


旧答案

您需要两次使用scale2ref过滤器。

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