Python基于mediainfo批量重命名图片文件


Posted in Python onDecember 29, 2020

案例故事:

大部分带彩色屏幕的终端设备,不管是手机,车机,电视等等,都需要涉及图片的显示,

作为一名专业的多媒体测试人员,我们需要一堆的规范化标准的图片测试文件,
但是现有的图片资源名字命名的很随意比如:IMG_20200325_161111.jpg,
以上命名不能看出图片文件的具体图片编码格式,分辨率等信息,
测试经理要求我进行批量重命名工作,模板如下,
图片编码格式_分辨率_位深度_容器.容器, 例如:
JPEG_1920x1080_32bit_jpg.jpg

图片编解码基本知识

图片编码:将某各风景画面取景转成图片数据文件的过程,取景肯定涉及取景的范围,
图片解码:将图片数据文件显示到屏幕上的过程。

主要涉及以下技术参数:

图片技术参数 参数释义 举例
图片编码格式 (压缩技术) 即像素点压缩的一类技术, 不同的编码格式, 其压缩率与压缩效果不一样。 JPEG, PNG, GIF, BMP, Webp, RAW, Heic
图片分辨率 (单位:Pixel) 图片长像素点的数量*图片宽像素点的数量 4096×2160(4K), 1920x1080, 1280x720,720×480, 640x480, 320x480等 甚至10亿像素的图片都存在的。
位深度 (单位:bit) 每个像素点所包含的数据量的大小 8bit, 16bit, 32bit
图片容器 文件后缀,将图片像素点封装的一种文件格式 .jpg; .png; .gif; .bmp; .heic; .webp等

我们碰到的任何图片文件,都是数据的集合,
一般数据越大,其图片越清晰。

准备阶段

  1. 确保mediainfo.exe 命令行工具已经加入环境变量
  2. 以下是某个图片文件的mediainfo信息, 都是文本,Python处理起来肯定很简单的。

Python基于mediainfo批量重命名图片文件

  • 如果要进行批量重命名图片,我们还是用输入输出文件架构,如下:
+---Input_Image  #批量放入待命名的图片文件
	|    1.jpg
	|    2.png
	|    
	+---Output_Image  #批量输出已命名的图片文件
	|    JPEG_1920x1080_32bit_jpg.jpg
	|	PNG_1280x720_32bit_png.png
	|
    \image_info.py  # 获取图片文件info信息的模块,
	\rename_image.py #调用image_info.py并实现重名,可双击运行

定义image_info.py模块

由于涉及较复杂的代码,建议直接用面向对象类的编程方式实现:

# coding=utf-8
 
import os
import re
import subprocess
 
 
class ImageInfoGetter():
  '''获取图片文件的Formate, 分辨率,位深度'''
 
  def __init__(self, image_file):
    '''判断文件是否存在,如果存在获取其mediainfo信息'''
    if os.path.exists(image_file):
      self.image_file = image_file
      p_obj = subprocess.Popen('mediainfo "%s"' % self.image_file, shell=True, stdout=subprocess.PIPE,
                   stderr=subprocess.PIPE)
      self.info = p_obj.stdout.read().decode("utf-8") # 解决非英文字符的编码问题
    else:
      raise FileNotFoundError("Not this File!") # 如果多媒体文件路径不存在,必须中断
 
  def get_image_format(self):
    '''获取图片的格式,比如JPEG, PNG, BMP等'''
    try:
      image_codec = re.findall(r"Format\s+:\s(.*)", self.info)[-1] # 取第最后一个Format字段
      image_codec = image_codec.strip() # 去除前后的空格
      if image_codec == "RGB":
        image_codec = "BMP"
    except:
      image_codec = "undef" # 防止程序因为异常而中断
    return image_codec
 
  def get_image_resolution(self):
    '''获取图片的分辨率'''
    try:
      image_widget = re.findall(r'Width\s+:\s(.*)pixels', self.info)[-1]
      image_widget = image_widget.replace(" ", "")
      image_height = re.findall(r'Height\s+:\s(.*)pixels', self.info)[-1]
      image_height = image_height.replace(" ", "")
      image_resolution = image_widget + "x" + image_height
    except:
      image_resolution = "undef" # 防止程序因为异常而中断
    return image_resolution
 
  def get_image_bit_depth(self):
    '''获取图片的位深度'''
    try:
      image_bit_depth = re.findall(r"Bit depth\s+:\s(.*bit)s", self.info)[-1].strip()
      image_bit_depth = image_bit_depth.replace(" ", "") # 去空格
    except:
      image_bit_depth = "undef" # 防止程序因为异常而中断
    return image_bit_depth
 
  def get_image_container(self):
    '''获取图片容器,即文件后缀名'''
    _, image_container = os.path.splitext(self.image_file)
    if not image_container:
      raise NameError("This file no extension")
    image_container = image_container.replace(".", "")
    image_container = image_container.lower() # 全部转成小写
    return image_container
 
 
if __name__ == '__main__':
  # 以下代码块,只是用来测试本模块的,一般不建议直接在这里大面积调用本模块'''
  i_obj = ImageInfoGetter("C:\\img.jpg")
  image_format = i_obj.get_image_format()
  print(image_format)
  image_resolution = i_obj.get_image_resolution()
  print(image_resolution)
  image_bit_depth = i_obj.get_image_bit_depth()
  print(image_bit_depth)
  image_container = i_obj.get_image_container()
  print(image_container)

调用image_info.py模块并实现批量重命名

# coding=utf-8
 
import os
import image_info
from shutil import copyfile
 
curdir = os.getcwd()
 
# 输入文件夹,放入待重命名的图片
input_image_path = os.path.join(curdir, "Input_Image")
filelist = os.listdir(input_image_path) # 获取文件列表
 
# 输出文件夹,已命名的图片存放在这里
output_image_path = os.path.join(curdir, "Output_Image")
 
# 如果没有Output_Image这个文件夹,则创建这个文件夹
if not os.path.exists(output_image_path):
  os.mkdir(output_image_path)
 
if filelist: # 如果文件列表不为空
  for i in filelist: # 遍历文件列表
    # 以下代码块,只是用来测试本模块的,一般不建议直接在这里大面积调用本模块'''
    image_file = os.path.join(input_image_path, i)
    i_obj = image_info.ImageInfoGetter(image_file)
    image_format = i_obj.get_image_format()
    image_resolution = i_obj.get_image_resolution()
    image_bit_depth = i_obj.get_image_bit_depth()
    image_container = i_obj.get_image_container()
    new_image_name = image_format + "_" + image_resolution + "_" + image_bit_depth + "_" \
             + image_container + "." + image_container
    print(new_image_name)
    new_image_file = os.path.join(output_image_path, new_image_name)
    copyfile(image_file, new_image_file) # 复制文件
else:
  print("It's a Empty folder, please input the image files which need to be renamed firstly!!!")
os.system("pause")

本案例练手素材下载

包含:mediainfo.exe(更建议丢到某个环境变量里去),
各种编码格式的图片文件,image_info.py模块,rename_image.py批处理脚本
点我下载
运行效果如下:

Python基于mediainfo批量重命名图片文件

以上可以看出,输入输出文件架构的好处, 我只需要将不同名字不同字符的,
待重命名的图片丢到Input_Image文件夹下,运行程序脚本后查看Output_Image输出文件,
就可以测试脚本的运行是否正常,健壮性(容错)是否符合要求,从而对这个程序脚本实现了“灰盒测试”。

小提示:

比如Android手机,Google推出了CDD(Compatibiltiy Definition Document兼容性定义文档),

其第5部分,涉及了很多图片编解码格式的规定:

Python基于mediainfo批量重命名图片文件

这就是Android最主要的图片多媒体编解码测试需求。

以上就是Python基于mediainfo批量重命名图片文件的详细内容,更多关于python 批量重命名文件的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python提示No module named images的解决方法
Sep 29 Python
python基于pyDes库实现des加密的方法
Apr 29 Python
python中实现指定时间调用函数示例代码
Sep 08 Python
python爬虫获取多页天涯帖子
Feb 23 Python
Python贪心算法实例小结
Apr 22 Python
Python函数返回不定数量的值方法
Jan 22 Python
PyQt5实现简易电子词典
Jun 25 Python
Python流程控制 while循环实现解析
Sep 02 Python
Python数据可视化:箱线图多种库画法
Nov 06 Python
python3 hdf5文件 遍历代码
May 19 Python
python pygame入门教程
Jun 01 Python
Python实现批量自动整理文件
Mar 16 Python
用python批量下载apk
Dec 29 #Python
python如何调用php文件中的函数详解
Dec 29 #Python
详解Open Folder as PyCharm Project怎么添加的方法
Dec 29 #Python
pycharm如何设置官方中文(如何汉化)
Dec 29 #Python
详解Pycharm第三方库的安装及使用方法
Dec 29 #Python
Django2.1.7 查询数据返回json格式的实现
Dec 29 #Python
Python 获取异常(Exception)信息的几种方法
Dec 29 #Python
You might like
虹吸壶煮咖啡26个注意事项
2021/03/03 冲泡冲煮
真正的ZIP文件操作类(php)
2007/07/21 PHP
PHP 程序员应该使用的10个组件
2009/10/31 PHP
php 操作excel文件的方法小结
2009/12/31 PHP
php获取文件夹路径内的图片以及分页显示示例
2014/03/11 PHP
php使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
PHP 记录访客的浏览信息方法
2018/01/29 PHP
贴一个在Mozilla中常用的Javascript代码
2007/01/09 Javascript
静态图片的十一种滤镜效果--不支持Ie7及非IE浏览器。
2007/03/06 Javascript
基于jquery实现拆分姓名的方法(纯JS版)
2013/05/08 Javascript
jQuery实现鼠标经过提示信息的地图热点效果
2015/04/26 Javascript
js变形金刚文字特效代码分享
2015/08/20 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
jquery实现下拉框多选方法介绍
2017/01/03 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
通过一个简单的例子学会vuex与模块化
2017/11/22 Javascript
使用vux实现上拉刷新功能遇到的坑
2018/02/08 Javascript
详解vue-loader在项目中是如何配置的
2018/06/04 Javascript
vue-router启用history模式下的开发及非根目录部署方法
2018/12/23 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
2019/12/09 Javascript
Python检测QQ在线状态的方法
2015/05/09 Python
python编写简单爬虫资料汇总
2016/03/22 Python
Python中对象的引用与复制代码示例
2017/12/04 Python
Python管理Windows服务小脚本
2018/03/12 Python
python单例模式实例解析
2018/08/28 Python
英国殿堂级有机护肤品牌:Rodial
2017/04/17 全球购物
优秀教师工作感言
2014/02/16 职场文书
幼儿教师寄语集锦
2014/04/03 职场文书
实验室标语
2014/06/21 职场文书
销售员未完成销售业绩的检讨书
2014/10/12 职场文书
小学生差生评语
2014/12/29 职场文书
亲戚关系证明
2015/06/24 职场文书
2015教师个人师德工作总结
2015/10/23 职场文书
为什么MySQL不建议使用SELECT *
2022/04/03 MySQL