ffmpeg实现图片放缩效果

zoompan filter实现

zoompan滤镜可以直接图片的放大缩小,范围是原图的1倍~10倍之间,
官方文档:https://ffmpeg.org/ffmpeg-filters.html#zoompan

Apply Zoom & Pan effect.
This filter accepts the following options:
zoom, z
Set the zoom expression. Range is 1-10. Default is 1.

其他参数参考官方文档即可,下面是一个例子:

ffmpeg -r 25 -y -i 1.jpg -filter_complex "scale=-2:10*ih,zoompan=z='if(lte(zoom,1.0),2,max(1.001,zoom-0.0065))':d=100:s=900x1280:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)',scale=-2:ih" -t 4 fa.mp4

效果如下(已转为gif):
请添加图片描述
放大效果同理,只需要交换下命令即可,可以自己尝试探索一下。

geq filter实现

geq则是ffmpeg另一个强大的滤镜,可以直接操作像素点来实现效果。
当然放大缩小也可以根据这个滤镜来实现。
官方文档:https://ffmpeg.org/ffmpeg-filters.html#geq

ffmpeg -y -i 2.jpg -filter_complex "[0:v]scale=-1:1280,pad=720:1280:0:0,loop=loop=-1:size=2,format=yuv444p,drawbox=color=black,geq='p(X*(2.0-1.5*T/2)+1.0*(1-(2.0-1.5*T/2))*W,Y*(2.0-1.5*T/2)+0.5*(1-(2.0-1.5*T/2))*H)',setsar=1[v]" -map '[v]' -pix_fmt yuv420p -t 2 out.mp4

在这里插入图片描述

OpenGL手写滤镜实现

定义相应的顶点着色器和片元着色器,ffmpeg手动定义AVFilter,自定义参数后,即可进行逐帧渲染,下面为一个简单的随时长从0到1的一个放大效果实现,熟悉矩阵的情况下,可以修改其中的mat来实现不同的效果。
这个方法还需要下载源码,添加新的AVFilter文件并重新编译,故此处只贴了着色器代码。

attribute vec2 position;
varying vec2 TextureCoordsVarying;
uniform float playTime;
uniform float durt;
 
void main(void) {
    float progress = mod(playTime, durt) / durt; // 实现0~1放大
    float zoom = 1.0 * progress;// 当前放大倍数
 
    mat4 zoomMat = mat4(
        zoom,       0.0,    0.0,    0.0,
        0.0,        zoom,       0.0,    0.0,
        0.0,    0.0,    zoom,   0.0,
        0.0,    0.0,    0.0,    1.0
    );
    gl_Position = zoomMat * vec4(position, 0.0, 1.0);
    TextureCoordsVarying.x = position.x * 0.5 + 0.5;
    TextureCoordsVarying.y = position.y * 0.5 + 0.5;
}
 
//precision highp float;
uniform sampler2D tex;
varying vec2 TextureCoordsVarying;
 
void main() {
    //TextureCoordsVarying.x = TextureCoordsVarying.x * 0.5 + 0.5;
    //TextureCoordsVarying.y = TextureCoordsVarying.y * 0.5 + 0.5;
    vec4 mask = texture2D(tex, TextureCoordsVarying);
 
    gl_FragColor = vec4(mask);
 
}

效果如下所示:
请添加图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐