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

news2024/11/19 13:22:39

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。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1610122.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎样在外网登录访问CRM管理系统?

一、什么是CRM管理系统? Customer Relationship Management,简称CRM,指客户关系管理,是企业利用信息互联网技术,协调企业、顾客和服务上的交互,提升管理服务。为了企业信息安全以及使用方便,企业…

我为什么想成为一名程序员

#为什么你选择成为一名程序员# 目录 原因: 后续选择: 结尾: 原因: 本人是一个00后,出生在农村当时经济相对来说比较落后,村里面基本上都没几个人有手机。当时有些小伙伴他们拿着自己大人的手机在那里玩…

Youtube DNN

目录 1. 挑战 2. 系统整体结构 3.召回 4. 排序 5. 训练和测试样本的处理 1. 挑战 (1)规模。很多现有的推荐算法在小规模上效果好,但Youtobe规模很大。 (2)新颖度。Youtobe语料库是动态的,每秒都会有…

Java中的栈和队列

1.前言 在计算机科学中,数据结构是用来组织和存储数据的方式,以便可以高效地访问和修改。栈和队列是两种最基本的数据结构,它们在各种计算过程中都有广泛的应用。本文将介绍栈和队列的概念、特性以及它们的一些常见应用。 2.栈 2.1概念 栈…

姑苏寻韵~庆开放原子开源大赛 OpenTiny 前端 Web 应用开发挑战赛路演圆满落幕。

春日已至,姑苏古城迎来了一场编程的盛宴——开放原子开源大赛OpenTiny前端Web应用开发挑战赛。历时三个月的激烈角逐,OpenTiny与众多开发者携手共赴这场智慧的较量。决赛路演于4月14日在苏州(太湖)产业软件园圆满落下帷幕~ 开放原…

编译一个基于debian/ubuntu,centos,arhlinux第三方系统

目录 前言 准备工作 下载linux源码进行编译 linux源码下载 网站 问题 解决办法 编译 可能会遇到的问题 chroot下载debian环境 进入虚拟环境 把chroot的根目录文件打包为.gz文件 编译init文件(用于系统启动时的一系列引导) 给予文件夹权限 …

Zabbix 监控软件(一)

通常我们服务搭建成功 但不清楚服务器的运行状况,这时候就需要会使用监控系统查看服务器状态以及网站流量指标,利用监控系统的数据去了解上线发布的结果,和网站的健康状态。 利用一个优秀的监控软件,我们可以: ●通过一个友好的界…

基于java+springboot+vue实现的物业管理系统(文末源码+Lw+ppt)23-23

摘 要 快速发展的社会中,人们的生活水平都在提高,生活节奏也在逐渐加快。为了节省时间和提高工作效率,越来越多的人选择利用互联网进行线上打理各种事务,通过线上物业管理系统也就相继涌现。与此同时,人们开始接受方…

Leetcode算法训练日记 | day31

专题九 贪心算法 一、分发饼干 1.题目 Leetcode:第 455 题 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的…

如何查看项目中使用的Qt版本

如何查看项目中使用的Qt版本 1.点击左下角电脑按钮查看Qt版本。 2.点击左侧栏项目按钮查看Qt版本。

Android开发——Fragment

Demo fragment_blank.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_pare…

Windows系统远程桌面服务(RDP)的安全层和加密级别

1.【win10企业版/server2012】 1.服务器运行gpedit.msc&#xff0c;打开本地组策略&#xff0c;进入列表目录【计算机配置】-【管理模板】-【windows组件】-【远程桌面服务】-【远程桌面会话主机】-【安全】 2.双击“远程(RDP)连接要求使用指定的安全层”选项&#xff0c;配置…

Redis入门到通关之数据结构解析-RedisObject

文章目录 ☃️概述☃️源码 ☃️概述 RedisObject 是 Redis 中表示数据对象的结构体&#xff0c;它是 Redis 数据库中的基本数据类型的抽象。在 Redis 中&#xff0c;所有的数据都被存储为 RedisObject 类型的对象。 RedisObject 结构体定义如下&#xff08;简化版本&#xf…

linux负载均衡 和 系统负载分析笔记

1 负载均衡 1.1 计算负载 1.1.1 PELT算法简介 从Linux3.8内核以后进程的负载计算不仅考虑权重&#xff0c;⽽且跟踪每个调度实体的历史负载情况&#xff0c;该算法称为PELT(Per-entity Load Tracking) 《奔跑吧Linux内核》卷1&#xff1a;基础架构&#xff1b;P505 相关资料…

LeetCode216:组合总和Ⅲ

题目描述 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 解题思想 使用回溯算法 代码 class So…

Cubemx+RTL8201驱动

Cubemx 生产的驱动只能选择LAN8742&#xff0c;无法适配RTL8201&#xff0c;这篇文字就分享一下如何逐步修改lan8742的代码去适配。 一、地址问题 入口函数&#xff1a;int32_t LAN8742_Init(lan8742_Object_t *pObj) 主要是做PHY 地址检测&#xff0c;但是我们查阅RTL8201手…

2024中国国际中医药健康服务博览会(7月深圳中医药展)

聚焦中医国粹&#xff0c;助力健康中国 2024第五届中国国际中医药健康服务&#xff08;深圳&#xff09;博览会 暨粤港澳大湾区中医药高质量发展大会 邀请函 时间&#xff1a;2024年7月31日-8月2日 地址:深圳会展中心&#xff08;福田&#xff09; 支持单位&#xff…

WIFISKY 7层流控路由器 confirm.php RCE漏洞复现

0x01 产品简介 WIFISKY-7层流控路由器是一款可用于家庭或办公环境的无线路由器,具备流控功能以优化网络流量和提供更稳定的网络连接。该路由器采用了7层流控技术,能够依据网络数据包的内容进行智能管理,从而实现对网络流量的精细化控制和优化。这种技术可以提升网络的整体性…

MySQL-数据库基础

一、背景与基本使用 首先是登录方式&#xff0c;一般用 mysql -h 127.0.0.1 -P 3306 -u root -p mysql也是一种网络服务。 当然我们在本地登录时可以省去主机ip和端口号。 -h表示我们要登录mysql在哪个ip的主机上&#xff0c; -P表示端口号。 -u表示以谁的身份去登录。…

DDR的概念解读-提升速度的四把板斧

计算机以及手机系统性能的改善&#xff0c;不仅仅取决于cpu处理器主频的提升&#xff0c;还与cpu和内存之间的访问速度密切相关。 SDRAM: Synchronous Dynamic Random Access Memory,同步动态随机存取存储器&#xff0c;同步是指Memory工作需要同步时钟&#xff0c;内部命令的发…