使用ffmpeg给图片加上边框,然后直接拼接图片

发布时间 2023-10-25 02:49:59作者: ZHider

需求:我有一组图片分辨率完全相同的图片,我希望能够将他们纵向拼接成一张长图。
思路:先将图片增加边框,然后拼接成一张长图。
理论上也可以使用一条命令而不生成中间文件,但这样会增加代码复杂度。

代码使用 Powershell脚本+ffmpeg程序。

# 获取到当前目录下所有 PNG 文件
$images = Get-ChildItem -Filter *.png
foreach ($image in $images) {
    # 将图片放置在 长宽各大4px 的纯黑背景上,图片的左上角坐标为 (2,2),以产生 2px 的边框
    ffmpeg -i $image.FullName -vf "pad=width=iw+4:height=ih+4:x=2:y=2:color=black" "$($image.FullName)_border.png"
}

$files = Get-ChildItem -Filter "*_border.png"
$inputs = ""
foreach ($file in $files) {
    # 累加输入源
    $inputs += "-i " + $file.FullName + " "
}
$command = "ffmpeg " + $inputs + "-filter_complex vstack=inputs=" + $files.Count + " out.png"
Write-Output $command
# 你可以在这里查看最终命令。
# 如果想要直接调用,可以在最后增加一个 Invoke-Expression $command

因为不太习惯用 powershell 的 foreach(感觉不如map好用,所以用了两次 gci(Get-ChildItem)

什么?你想要bat?好吧,我也写了一个bat版本的。

@echo off
rem 获取到当前目录下所有 PNG 文件
for %%f in (*.png) do (
    rem 将图片放置在 长宽各大4px 的纯黑背景上,图片的左上角坐标为 (2,2),以产生 2px 的边框
    call ffmpeg -i "%%f" -vf "pad=width=iw+4:height=ih+4:x=2:y=2:color=black" "%%~nf_border.png"
)

set "inputs="
set "count=0"
rem 遍历所有带边框的图片
for %%f in (*_border.png) do (
    rem 累加输入源
    set "inputs=%inputs% -i %%f"
    rem 计算图片数量
    set /a count+=1
)
rem 生成最终命令
set "command=call ffmpeg %inputs% -filter_complex vstack=inputs=%count% out.png"
echo %command%
rem 你可以在这里查看最终命令。
rem 如果想要直接调用,可以在最后增加一个 %command%

但是对于bat版本的,provide as is