2.Python实战小项目—用Python批量压缩图片

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数据分析项目🔥🔥
机器学习机器学习算法🔥🔥
人工智能人工智能

三·原理

批量压缩图片的原理主要涉及遍历文件夹、判断图片类型和进行压缩操作

  1. 遍历文件夹:编写程序以访问指定文件夹,并列出其中的所有图片文件。这一步是实现批量处理的基础,确保能够找到并处理目标图片文件。
  2. 判断图片类型:根据图片文件的扩展名(如.jpg、.png、.gif等)来判断图片的类型。这是因为不同类型的图片可能需要采用不同的压缩策略或工具。
  3. 进行压缩操作:对不同类型的图片应用相应的压缩方法。例如,对于JPEG格式的图片,可以使用Pillow库中的优化flag、渐进式JPEG和动态质量设置来实现高效的压缩。而对于PNG格式的图片,可能需要采用其他方法或工具来进行压缩。

在实际操作中,可以通过设置压缩率来控制图片的大小。例如,使用Pillow库导入图片后,按照指定的压缩率保存图片,从而实现图片的缩小。

四·流程

要使用Python批量压缩图片,可以按照以下流程进行:

  1. 安装Pillow库,这是一个Python图像处理库。
  2. 导入所需的模块。
  3. 定义一个函数,用于压缩单个图片。
  4. 遍历文件夹中的所有图片文件。
  5. 对每个图片文件调用压缩函数。
  6. 保存压缩后的图片。

五·实战演示

我们先按“修改时间”顺序获取图片文件夹下的所有图片的完整路径。

#将图片按修改时间排序(这样才能与图片的描述一致),将路径存入列表,以便后面逐个插入图片时调用
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() 函数是获取文件最后修改时间
  1. 首先,导入os模块,它提供了与操作系统交互的功能。
  2. 定义一个变量path,它的值为字符串"6s_pictures",表示要处理的文件夹路径。
  3. 使用列表推导式创建一个名为list_p的列表,其中包含文件夹中所有图片文件的完整路径。这是通过将文件夹路径与每个文件名拼接起来实现的。
  4. 使用sort()方法对list_p列表进行排序。key参数接受一个函数,该函数用于确定排序的依据。在这里,我们使用lambda表达式定义了一个匿名函数,它接受一个路径作为输入,并返回该路径对应文件的最后修改时间。os.path.getmtime()函数用于获取文件的最后修改时间。
  5. 经过排序后,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。

在这里插入图片描述

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

以山河作礼。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值