我有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
如果两个图像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)。
答案 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