如何避免FFmpeg添加水印时增大图片尺寸
解决FFmpeg叠加边框后图片物理尺寸变大的问题
问题原因
你遇到的物理尺寸变大问题,大概率是因为FFmpeg处理时没有保留原图片的DPI(每英寸像素数)信息,或者movie滤镜读取边框图时采用了默认DPI(通常是96DPI),导致输出时用错误的DPI计算物理尺寸。即便输入图和边框图物理尺寸相同,它们的DPI可能不一致,或者FFmpeg输出时重置了DPI参数。
解决方案
方法1:改用双输入方式叠加,保留原DPI
放弃movie滤镜,直接将边框图作为第二个输入源,同时强制输出时继承原输入图的DPI参数:
先获取原输入图的DPI值(以
input.png为例):# 获取水平DPI X_DPI=$(ffprobe -v error -select_streams v:0 -show_entries stream_tags=x_resolution -of default=noprint_wrappers=1:nokey=1 input.png) # 获取垂直DPI Y_DPI=$(ffprobe -v error -select_streams v:0 -show_entries stream_tags=y_resolution -of default=noprint_wrappers=1:nokey=1 input.png)执行叠加命令,同时设置输出DPI与原输入一致:
ffmpeg -i input.png -i border.png -filter_complex "[0][1]overlay=0:0" -metadata x_resolution=$X_DPI -metadata y_resolution=$Y_DPI output.png
方法2:强制输出像素尺寸与输入一致
如果不确定DPI问题,也可以直接指定输出的像素尺寸和输入图完全相同,确保物理尺寸匹配:
先获取输入图的像素宽高:
IMG_SIZE=$(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 input.png)执行叠加命令时强制输出尺寸:
ffmpeg -i input.png -i border.png -filter_complex "[0][1]overlay=0:0" -s $IMG_SIZE output.png
方法3:修复movie滤镜的DPI问题(不推荐)
如果你坚持用movie滤镜,可以在滤镜中指定边框图的DPI,或者强制输出尺寸:
ffmpeg -i input.png -vf "movie=border.png:metadata=1 [watermark]; [in][watermark] overlay=0:0,scale=$(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 input.png) [out]" output.png
这里通过scale滤镜强制输出和输入同像素尺寸,同时movie=border.png:metadata=1尝试读取边框图的元数据。
验证结果
处理完成后,可以用图片查看工具(如Photoshop、GIMP)检查输出图的物理尺寸,确认是否和输入的5.13x7.63英寸一致。
内容的提问来源于stack exchange,提问作者NXT_2006
相关产品推荐
相关产品推荐

