gpt4 book ai didi

ffmpeg - 如何将 2 个图像与 ffmpeg 结合起来?

转载 作者:行者123 更新时间:2023-12-04 22:53:12 27 4
gpt4 key购买 nike

我有两张图片,我想将一张放在另一张上面。我做了这行:

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 以使这条线适用于任何类型的分辨率?

我想找到一个最大尺寸并将另一个图像缩放到它保持纵横比。如果 2 张图像的纵横比不同,则用纯白色 (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)。

最佳答案

利用

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

这将按比例缩放具有较小尺寸的图像,以匹配两个输入的最大尺寸。然后将调整大小的图像覆盖在相同宽度的 Canvas 上,最后堆叠。

旧答案

您需要使用 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

关于ffmpeg - 如何将 2 个图像与 ffmpeg 结合起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52542896/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com