FFMPEG命令生成各国国旗

博客介绍了使用FFmpeg绘制多国国旗的方法,涉及亚洲的中国、朝鲜、韩国等,以及欧洲的爱沙尼亚、俄罗斯、德国等。详细说明了各国国旗的绘制步骤,如中国国旗通过三角形旋转叠加等操作,部分绘制因命令过长或颜色色差等存在问题。

亚洲篇

中国

先画个五角星

  1. 在100x100的画布P1中,先画一个三角形M
    ffplay -f lavfi -i color=ffffff00:100x100[white];[white]geq=r='if(gt(X*tan(72*PI/180),Y),r(X,Y),255)':g='if(gt(X*tan(72*PI/180),Y),g(X,Y),255)':b='if(gt(X*tan(72*PI/180),Y),b(X,Y),0)'
  2. 此三角形M水平镜像后得到M1, M1与M水平方向并列排布,得到200x100的画布P2,内部为等腰三角形,三角形包含了向上方向的三角形
    ffplay -f lavfi -i color=ffffff00:100x100[white];[white]geq=r='if(gt(X*tan(72*PI/180),Y),r(X,Y),255)':g='if(gt(X*tan(72*PI/180),Y),g(X,Y),255)':b='if(gt(X*tan(72*PI/180),Y),b(X,Y),0)'[triangle];[triangle]split=2[T1][T2];[T2]hflip[T22];[T22][T1]hstack=2
  3. 针对200x100的画布P2,底部再填充200x100的白色,变为 200x200的画布P3,此时等腰三角形在画布上半部,注意使用colorkey filter将背景白色抠图为透明色
    ffplay -f lavfi -i color=ffffff00:100x100[white];[white]geq=r='if(gt(X*tan(72*PI/180),Y),r(X,Y),255)':g='if(gt(X*tan(72*PI/180),Y),g(X,Y),255)':b='if(gt(X*tan(72*PI/180),Y),b(X,Y),0)'[triangle];[triangle]split=2[T1][T2];[T2]hflip[T22];[T22][T1]hstack=2[UP];[UP]pad=iw:ih*2:0:0:ffffff00[T];[T]colorkey=white
  4. 画布P3,一分为五,分布旋转0/72/144/216/288度,得到五个方向的三角形,overly排布后即可.
    ffplay -f lavfi -i color=ffffff00:100x100[white];[white]geq=r='if(gt(X*tan(72*PI/180),Y),r(X,Y),255)':g='if(gt(X*tan(72*PI/180),Y),g(X,Y),255)':b='if(gt(X*tan(72*PI/180),Y),b(X,Y),0)'[triangle];[triangle]split=2[T1][T2];[T2]hflip[T22];[T22][T1]hstack=2[UP];[UP]pad=iw:ih*2:0:0:ffffff00[T];[T]colorkey=white[RAW];[RAW]split=5[T1][T2][T3][T4][T5];[T2]rotate=a=(72*PI/180):c=ffffff00[R2];[T3]rotate=a=(144*PI/180):c=ffffff00[R3];[T4]rotate=a=(216*PI/180):c=ffffff00[R4];[T5]rotate=a=(288*PI/180):c=ffffff00[R5];[R2][R3]overlay[U1];[R4][R5]overlay[U2];[U1][U2]overlay[V1];[V1][T1]overlay
  5. 由于三角形的边缘的颜色,旋转之后会导致一些边缘出现在五角星内部,故要除去此边缘,
    ffplay -f lavfi -i color=ffffff00:100x100[white];[white]geq=r='if(gt(X*tan(72*PI/180),Y),r(X,Y),255)':g='if(gt(X*tan(72*PI/180),Y),g(X,Y),255)':b='if(gt(X*tan(72*PI/180),Y),b(X,Y),0)'[triangle];[triangle]split=2[T1][T2];[T2]hflip[T22];[T22][T1]hstack=2[UP];[UP]pad=iw:ih*2:0:0:ffffff00[T];[T]colorkey=white[RAW];[RAW]split=5[T1][T2][T3][T4][T5];[T2]rotate=a=(72*PI/180):c=ffffff00[R2];[T3]rotate=a=(144*PI/180):c=ffffff00[R3];[T4]rotate=a=(216*PI/180):c=ffffff00[R4];[T5]rotate=a=(288*PI/180):c=ffffff00[R5];[R2][R3]overlay[U1];[R4][R5]overlay[U2];[U1][U2]overlay[V1];[V1][T1]overlay[star];[star]geq=r='if(gt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2),1468*H*H/(200*200)),r(X,Y),255)':g='if(gt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2),1468*H*H/(200*200)),g(X,Y),255)':b='if(gt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2),1468*H*H/(200*200)),b(X,Y),0)'
    画图命令为:
    ffmpeg -f lavfi -i color=ffffff00:100x100[white];[white]geq=r='if(gt(X*tan(72*PI/180),Y),r(X,Y),255)':g='if(gt(X*tan(72*PI/180),Y),g(X,Y),255)':b='if(gt(X*tan(72*PI/180),Y),b(X,Y),0)'[triangle];[triangle]split=2[T1][T2];[T2]hflip[T22];[T22][T1]hstack=2[UP];[UP]pad=iw:ih*2:0:0:ffffff00[T];[T]colorkey=white[RAW];[RAW]split=5[T1][T2][T3][T4][T5];[T2]rotate=a=(72*PI/180):c=ffffff00[R2];[T3]rotate=a=(144*PI/180):c=ffffff00[R3];[T4]rotate=a=(216*PI/180):c=ffffff00[R4];[T5]rotate=a=(288*PI/180):c=ffffff00[R5];[R2][R3]overlay[U1];[R4][R5]overlay[U2];[U1][U2]overlay[V1];[V1][T1]overlay[star];[star]geq=r='if(gt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2),1468*H*H/(200*200)),r(X,Y),255)':g='if(gt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2),1468*H*H/(200*200)),g(X,Y),255)':b='if(gt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2),1468*H*H/(200*200)),b(X,Y),0) -frames:v 1 -y five_pointed_star.png
    请添加图片描述
    OK,再来看下维基百科上中国国旗的绘画方法
    请添加图片描述
    其中红色色号为 #ee1c25, 黄色色号为 #ffff00,其中的尺寸特征
  • 宽高为3000x2000,
  • 大五角星的外圆半径为300,叠加坐标为(200, 200),小五角星的外圆半径为100,叠加坐标分别为(900, 100), (1100, 300) (1100, 600),(900, 800)
  • 四颗小五角星的旋转角度分别为逆时针 90+arctan(3/5), 90+arctan(1/7), 90+arctan(7/2), 90+arctan(5/4)
  • OK, 开始绘画
  1. 绘制透明的大五角星
    ffmpeg -f lavfi -i color=white:300x300[white];[white]geq=r='if(gt(X*tan(72*PI/180),Y),r(X,Y),255)':g='if(gt(X*tan(72*PI/180),Y),g(X,Y),255)':b='if(gt(X*tan(72*PI/180),Y),b(X,Y),0)'[triangle];[triangle]split=2[T1][T2];[T2]hflip[T22];[T22][T1]hstack=2[UP];[UP]pad=iw:ih*2:0:0:white[T];[T]colorkey=white[RAW];[RAW]split=5[T1][T2][T3][T4][T5];[T2]rotate=a=(72*PI/180):c=white[R2];[T3]rotate=a=(144*PI/180):c=white[R3];[T4]rotate=a=(216*PI/180):c=white[R4];[T5]rotate=a=(288*PI/180):c=white[R5];[R2][R3]overlay[U1];[R4][R5]overlay[U2];[U1][U2]overlay[V1];[V1][T1]overlay[star];[star]geq=r='if(gt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2),1468*H*H/(200*200)),r(X,Y),255)':g='if(gt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2),1468*H*H/(200*200)),g(X,Y),255)':b='if(gt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2),1468*H*H/(200*200)),b(X,Y),0)'[s1];[s1]colorkey=white:0.35 -frames:v 1 -y big_star.png
  • 绘制小的五角星,无须透明
    ffmpeg -f lavfi -i color=white:100x100[white];[white]geq=r='if(gt(X*tan(72*PI/180),Y),r(X,Y),
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值