2.Python实战小项目—用Python批量压缩图片
- 一·摘要
- 二·个人简介
- 三·原理
- 四·流程
- 五·实战演示
一·摘要
在Python中,批量压缩图片是一项相对直接且实用的任务,尤其适合需要处理大量图像数据的场合。Pillow库提供了一种简便的方式来达成这个目标,其强大的图像处理功能使得图片的压缩变得既简单又灵活。通过上述步骤的实现,我们不仅能够减少图片文件的大小,节省存储空间,还能保持图片的质量在一个可接受的范围内。该流程可以根据实际需求轻松调整,例如改变输出的图片格式、调整图片尺寸或者转换图片的颜色模式等。使用Python和Pillow库进行图片批量压缩,是一个效率高、成本低且易于实施的解决方案。
二·个人简介
🏘️🏘️个人主页:以山河作礼。
🎖️🎖️:Python领域新星创作者,CSDN实力新星认证,CSDN内容合伙人,阿里云社区专家博主,新星计划导师,在职数据分析师。
💕💕悲索之人烈焰加身,堕落者不可饶恕。永恒燃烧的羽翼,带我脱离凡间的沉沦。
类型 | 专栏 |
---|---|
Python基础 | Python基础入门—详解版 |
Python进阶 | Python基础入门—模块版 |
Python高级 | Python网络爬虫从入门到精通🔥🔥🔥 |
Web全栈开发 | Django基础入门 |
Web全栈开发 | HTML与CSS基础入门 |
Web全栈开发 | JavaScript基础入门 |
Python数据分析 | Python数据分析项目🔥🔥 |
机器学习 | 机器学习算法🔥🔥 |
人工智能 | 人工智能 |
三·原理
批量压缩图片的原理主要涉及遍历文件夹、判断图片类型和进行压缩操作。
- 遍历文件夹:编写程序以访问指定文件夹,并列出其中的所有图片文件。这一步是实现批量处理的基础,确保能够找到并处理目标图片文件。
- 判断图片类型:根据图片文件的扩展名(如.jpg、.png、.gif等)来判断图片的类型。这是因为不同类型的图片可能需要采用不同的压缩策略或工具。
- 进行压缩操作:对不同类型的图片应用相应的压缩方法。例如,对于JPEG格式的图片,可以使用Pillow库中的优化flag、渐进式JPEG和动态质量设置来实现高效的压缩。而对于PNG格式的图片,可能需要采用其他方法或工具来进行压缩。
在实际操作中,可以通过设置压缩率来控制图片的大小。例如,使用Pillow库导入图片后,按照指定的压缩率保存图片,从而实现图片的缩小。
四·流程
要使用Python批量压缩图片,可以按照以下流程进行:
- 安装Pillow库,这是一个Python图像处理库。
- 导入所需的模块。
- 定义一个函数,用于压缩单个图片。
- 遍历文件夹中的所有图片文件。
- 对每个图片文件调用压缩函数。
- 保存压缩后的图片。
五·实战演示
我们先按“修改时间”顺序获取图片文件夹下的所有图片的完整路径。
#将图片按修改时间排序(这样才能与图片的描述一致),将路径存入列表,以便后面逐个插入图片时调用
import os
path = "6s_pictures"
list_p = [path+"\\"+i for i in os.listdir(path)] #获取图片的文件名,并拼接完整路径
list_p.sort(key=lambda path: os.path.getmtime(path)) #将列表中的文件按其修改时间排序,os.path.getmtime() 函数是获取文件最后修改时间
- 首先,导入os模块,它提供了与操作系统交互的功能。
- 定义一个变量path,它的值为字符串"6s_pictures",表示要处理的文件夹路径。
- 使用列表推导式创建一个名为list_p的列表,其中包含文件夹中所有图片文件的完整路径。这是通过将文件夹路径与每个文件名拼接起来实现的。
- 使用sort()方法对list_p列表进行排序。key参数接受一个函数,该函数用于确定排序的依据。在这里,我们使用lambda表达式定义了一个匿名函数,它接受一个路径作为输入,并返回该路径对应文件的最后修改时间。os.path.getmtime()函数用于获取文件的最后修改时间。
- 经过排序后,list_p列表中的图片文件路径将按照它们的修改时间进行排序。
然后导入Image模块。for循环遍历所有图片的路径,然后读取图片尺寸,x对应宽度,y对应高度。这里的单位是像素。压缩图片的关键参数是压缩后的标准宽度x_s,我们Word模板中放置图片的单元格宽度为6.25厘米。压缩后的图片分辨率是96,像素为230的时候,对应长度是6.1厘米。以上换算可参考链接https://www.gaitubao.com/tools/pixel2cm.html 。但是按230像素的宽度压缩后,自动填充到Word文档中后,图片宽度变成了8厘米,已经超过单元格的宽度了。通过调试,最终将标准宽度设定为165像素,填入word中后,宽度是5.82厘米,比较适合单元格宽度。这个差异可能是换算的不精确导致。确定好标准宽度x_s后,高度y_s按照标准宽度乘上原始高宽比来确定,这样就是保持比例压缩,不会导致图片变形。压缩resize后,再保存到新的文件夹。
代码如下:
#按比例缩小图片尺寸
from PIL import Image
for infile in list_p:
im = Image.open(infile)
(x,y) = im.size #读取图片尺寸(像素)
x_s = 165 #定义缩小后的标准宽度
y_s = int(y * x_s / x) #基于标准宽度计算缩小后的高度
out = im.resize((x_s,y_s),Image.ANTIALIAS) #改变尺寸,保持图片高品质
out.save('6s_pictures_new\\{}'.format(infile.split("\\")[-1]))
然后从新的文件夹提取图片,填入word表格。
from docx import Document
doc = Document("6S稽查问题模板.docx")
import os
path = "6s_pictures_new"
list_p = [path+"\\"+i for i in os.listdir(path)] #获取图片的文件名,并拼接完整路径
list_p.sort(key=lambda path: os.path.getmtime(path)) #将列表中的文件按其修改时间排序,os.path.getmtime() 函数是获取文件最后修改时间
table = doc.tables[0] #已确定是第一个表格,其索引是0
#增加需要的行,以便足够填入数据
for i in range(len(data)-1):
table.add_row()
#写入数据及图片
for row in range(1,len(data)+1):
#插入图片
run = table.cell(row,2).paragraphs[0].add_run() #新增一个文字块
picture = run.add_picture(list_p[row-1]) #插入图片
doc.save("6S稽查问题.docx")
结果如下,可见图片的宽度全部是固定的,高度根据单元格自动调整,这样就保持了word文档模板中设定的宽度,不至于变形。而且整个文档只有90KB。