FFmpeg 详解 scale 画面缩放过滤器

其他阅读:ffmpeg实例,split,pad,crop,scale,hflip,overlay_张雨zy的博客-CSDN博客_ffmpeg split在这个滤镜链图中,利用split滤镜把输入流分离成了两路流,其中一路通过crop滤镜和vfilp滤镜的同一路级联应用,再同另外一路一起通过overlay滤镜处理的流合成进行输出。ffmpeg -i INPUT -vf “split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2” OU...https://blog.csdn.net/yu540135101/article/details/84332055

 

下面这张是本文所使用的原始图片,分辨率 535x346。

简单缩放

如果想要简单地把图片resize为指定的宽高 320x240,可以使用 scale 过滤器的基本用法:

ffmpeg -i input.avi -vf scale=320:240 output.avi

用于缩放图片也一样有效:

ffmpeg -i input.jpg -vf scale=320:240 output_320x240.png

原始图片经过这么变换后,是这个样子:

你也看到了,前后宽高比不同,画面出现了拉伸。

保持宽高比缩放

如果想要保持宽高比,那么我们需要先手动固定一个元素,比如宽度,或者高度,然后另外一个视情况而定。用下面的写法:

ffmpeg -i input.jpg -vf scale=320:-1 output_320.png

上面的指令,先固定宽度=320px,高度则根据情况裁切。保证了图片不变形。最终图片呈现为 320x207 的分辨率。如下:

一些编码器会要求宽度/高度是n的倍数,那么可以将 -1 指定为需要的值,如下:

ffmpeg -i input.jpg -vf scale=320:-2 output_320.png 

这样得到的就是一个 320x206 像素的图片。

使用变量

ffmpeg 过滤器内置了很多非常有用的变量,我们可以方便地使用,并组装成功能复杂的用法。比如把宽度拉伸2倍:

ffmpeg -i input.jpg -vf scale=iw*2:ih input_double_width.png

图片处理后长这样:

如果是宽高都缩放到原始图片的一半,则可以是乘以 0.5 或 除以 2,像下面这样写:

ffmpeg -i input.jpg -vf "scale=iw*.5:ih*.5" input_half_size.png
ffmpeg -i input.jpg -vf "scale=iw/2:ih/2" input_half_size.png

避免图像放大

有时缩放图像,但如果尺寸太低,想要避免将其放大,我们可以使用 min 来限定:

ffmpeg -i input.jpg -vf "scale='min(320,iw)':'min(240,ih)'" input_not_upscaled.png

上述命令,宽度最低 320 像素,高度最低 240 像素。如果是低于此像素值的,会保持原始值。

适配固定宽高比的窗口

我们经常见到在短视频中分屏显示,比如用户喜欢玩的同步动作,需要将视频装进固定的窗口内,要怎么样操作呢?

这个时候你需要 force_original_aspect_ratio 选项,它提供两个值:

  • decrease:输出视频自动减小
  • increase:输出视频自动增大

下面的指令将原始图片强制装进一个 320x240 的盒子,并保持宽高比缩小比例:

ffmpeg -i input.jpg -vf scale=w=320:h=240:force_original_aspect_ratio=decrease output_320.png

输出的图片分辨率 320x207,跟前面贴出的那张一致:

缩放到矩形区域之后,画面还会有一些空白,我们可以使用 pad 选项填充黑边:

ffmpeg -i input.jpg -vf "scale=320:240:force_original_aspect_ratio=decrease,pad=320:240:(ow-iw)/2:(oh-ih)/2" output_320_padding.png

上述指令有几个常量需要注意,这是经常使用的常量:

  • iw:输入图片宽度
  • ih:输入图片高度
  • ow:输出图片宽度
  • oh:输出图片高度

高阶:指定缩放算法

你可以使用 -sws_flags 选项指定缩放所使用的算法。比如明确指定使用 bilinear 代替默认的 bicubic 算法:

ffmpeg -i test.tif -vf scale=504:376 -sws_flags bilinear out.bmp

要同时适用多个算法,那就用 + 号连起来写:

-sws_flags lanczos+full_chroma_inp

或者不使用该选项,直接在 scale 过滤器内指定:

-vf scale=1920x1080:flags=lanczos

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戴国进

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值