基于Python使用ffmpeg批量缩放图片

基于Python使用ffmpeg批量缩放图片

一、前言

​ 笔者因为项目原因或者个人撰文需要,经常要写大量技术文档,文档中通常需要配图,但配图就有一个比较讨厌的问题:截图大小不一,宽度通常要手动调整,非常麻烦。那有没有好的办法可以解决?是有的,我们可以通过批量图片处理软件,预先将图片的宽度都调成一样,长度跟随比例缩放,这样在写文档插入图片就不用再逐个调整,大部分直接可用。

​ 市面上这样的软件很多,百度和知乎一搜就有好多,它们有精美的界面,简易的操作,和强大的工具箱,免费的广告和收费的主题…反正不被笔者所爱。

​ 基于上述原因,笔者目光转移到了开源软件,之前用ffmpeg做过视频处理,它强大的功能给笔者留下了很深刻的印象。软件有了,要实现批量处理需要写脚本自动遍历文件夹并提取,再调用ffmpeg处理。可选项有不少:matlab脚本、BAT脚本、Python脚本。Matlab强大的同时也异常庞大,放弃。BAT脚本易用但难写,放弃。最终本文基于Python脚本编写了脚本调用ffmpeg实现了图片的批量缩放。

​ 文中代码参考了博主:星沉地动的文章。原文处理的是视频文件,用于格式转换,笔者对代码进行了改写,实现图片的缩放。有兴趣的读者可以移步原文章:

原文链接:https://blog.csdn.net/qq446252221/article/details/111679491

二、ffmpeg简介

​ ffmpeg是一款强大的开源音视频处理软件,被网友称为:“多媒体处理神器”,它由鼎鼎大名的天才程序员法布里斯•贝拉编写并开源。ffmpeg你不一定听过,但是使用ffmpeg作为内核的视频播放器和音视频工具,大部分读者一定用过:Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音,格式工厂等,还有众多播放器使用开源的ffmpeg但并不对外公布。

​ 它通常被用来处理音视频数据,在本文中被用来处理图片,可谓大材小用了。

​ 对批处理脚本有兴趣的读者,想必软件安装定不是难题,笔者不在此多费口舌,自行检索安装即可,安装后记得在作者脚本代码中更改ffmpeg路径为自己的安装路径。

​ 最后,法布里斯•贝拉简直是个神,有兴趣的可以去找他的履历看一下。

在这里插入图片描述

三、Python

​ 这个,不想多说,只说一句话**:“人生苦短,我用Python”**,各位读者自行安装吧。

​ 使用本文脚本的步骤是:

  1. 安装Python(已安装可忽略)

  2. 安装ffmpeg(已安装可忽略)

  3. 将脚本拷贝到图片所在的根目录,修改脚本代码以下宏定义内容:ffmpeg路径,长宽参数,需要处理的图片扩展名。

  4. 在该目录下通过以下命令调用脚本:

    python '.\Picture Process.py'
    

    ​ 脚本运行结束后会在源文件目录的上一级目录新建**“NewPicture”**文件夹,并将缩放完成后的图片存入其中。

四、脚本运行效果

  1. 源图片分辨率 1718*636

    在这里插入图片描述

  2. 处理后图片分辨率800*296

    在这里插入图片描述

    新生成的所有图片,都按照脚本参数进行了宽度为800的限制,高度等比例缩放。即:小于该分辨率的图片将被放大,大于该分辨率的图片将被缩小。

五、源代码

​ 最后,贴上源代码:

import os
from turtle import heading
 
#设置ffmpeg路径
EXE_PATH="D:\\ffmpeg\\bin\\ffmpeg.exe"
#源图像路径
src_dir = ".\\"
#目标路径
dst_dir = "..\\NewPicture\\"
#图片文件扩展名
src_name= ".jpg"

# ffmpeg参数设置
#设置长度
width = 800
#设置宽度
height = -1
# 二者任何一个参数为-1时,将保持比例跟随另一个参数缩放 

""" Picture_Zoom函数定义
调用ffmpeg """
def Picture_Zoom(exe_path, src_path, dst_path):
	# 命令编辑
	cmd_line = '%s -i "%s" -vf scale="%s":"%s" -q 1 "%s"' % (exe_path, src_path,width,height,dst_path)
	# 调用命令行
	ret = os.system(cmd_line)
	if ret == 0:
		return True
	else:
		return False

""" Process_dir函数定义
遍历目录下所有文件并调用ffmpeg处理 """
def Process_dir(exe_path, src_dir, dst_dir):
	# 判断源目录是否存在
	if not os.path.exists(src_dir):
		print("The directory does not exist!")
		return
	#判断目标目录是否存在,若目标路径已存在,
	#先删除原来的旧目录
	if os.path.exists(dst_dir):
		# 调用CMD命令“rmdir”删除旧目录
		os.system('rmdir /s/q "%s"' % dst_dir)
	# 新建目标目录
	if not os.path.exists(dst_dir):
		os.mkdir(dst_dir)
	# 枚举源目录下的文件
	picture_list = os.listdir(src_dir)
	# 遍历指定扩展名的图像文件并处理
	for file in picture_list:
		if file.endswith(src_name):
			print("+Convert file:", file)
			# 生成新的源图片路径
			src_path = src_dir + file
			# 生成新的目标图片路径
			dst_path = dst_dir + file
			# 调用ffmpeg进行缩放
			Picture_Zoom(exe_path, src_path, dst_path)
 
Process_dir(EXE_PATH,src_dir, dst_dir)

#By ZhangJianCe 2022.3.17

猜你喜欢

转载自blog.csdn.net/lone5moon/article/details/123547179