使用Python批量压缩图片

当涉及到处理大量图片并确保它们符合特定大小要求时,Python 中的 PIL 库(现在称为 Pillow)提供了强大的工具。本文将详细介绍如何利用 Python 和 Pillow 库编写一个批量压缩图片的程序,以及如何将这些图片保存到指定目录中。

介绍

在许多应用程序中,特别是在网页开发和移动应用开发中,经常需要将图片压缩到较小的尺寸,以提高加载速度和节省带宽。本文将教你如何使用 Python 编写一个程序,自动压缩指定文件夹中的所有图片,并将它们保存到另一个目录中。

准备工作

确保你已经安装了 Python 环境,并且安装了 Pillow 库。Pillow 是 Python 中用于处理图片的库,它支持几乎所有主流的图片格式,并提供了丰富的图像处理功能。

pip install Pillow

编写代码

1. 导入必要的库
from PIL import Image
import os
2. 编写图片压缩函数

下面是一个函数 compress_image,用于压缩单个图片,并保存到指定路径。

def compress_image(input_image_path, output_image_path, target_size_kb, quality=85):try:with Image.open(input_image_path) as img:img.save(output_image_path, quality=quality)# 检查压缩后的文件大小output_size_kb = os.path.getsize(output_image_path) / 1024.0  # 转换为KBif output_size_kb < target_size_kb:print(f"Compressed image saved to {output_image_path}, size: {output_size_kb:.2f} KB")return Trueelse:print(f"Image {input_image_path} could not be compressed to less than {target_size_kb} KB.")return Falseexcept Exception as e:print(f"Error compressing image {input_image_path}: {e}")return False

此函数打开指定路径的图片,按照设定的质量参数压缩图片,并将压缩后的图片保存到输出路径。它还会检查输出图片的大小,如果小于目标大小,就打印成功信息;否则打印失败信息。

3. 编写批量压缩函数

接下来编写一个函数 batch_compress_images,它将遍历输入文件夹中的所有图片,并调用 compress_image 函数进行压缩处理。

def batch_compress_images(input_folder, output_folder, target_size_kb, quality=85):if not os.path.exists(output_folder):os.makedirs(output_folder)total_success = 0total_images = 0for filename in os.listdir(input_folder):if filename.endswith('.jpg') or filename.endswith('.jpeg') or filename.endswith('.png'):input_image_path = os.path.join(input_folder, filename)output_image_path = os.path.join(output_folder, filename)if compress_image(input_image_path, output_image_path, target_size_kb, quality):total_success += 1total_images += 1print(f"Batch compression completed. {total_success} out of {total_images} images successfully compressed.")

这个函数首先检查输出文件夹是否存在,如果不存在则创建。然后遍历输入文件夹中的每个文件,仅处理以 .jpg, .jpeg, .png 结尾的图片文件。对每个符合条件的文件,调用 compress_image 函数进行压缩,并统计成功压缩的图片数量。

4. 示例用法

在示例代码中,我们指定了输入图片文件夹路径、输出压缩后图片文件夹路径以及目标压缩大小(单位为KB),然后调用 batch_compress_images 函数进行批量压缩。

input_folder = 'input_images'  # 输入图片文件夹路径
output_folder = 'output_compressed'  # 输出压缩后图片文件夹路径
target_size_kb = 150  # 目标压缩大小,单位为KB# 调用函数进行批量压缩
batch_compress_images(input_folder, output_folder, target_size_kb)

结论

通过这篇博客,你学习了如何使用 Python 和 Pillow 库来批量压缩图片,并将它们保存到指定的文件夹中。这对于需要优化网页加载速度或节省存储空间的项目特别有用。你可以根据实际需求调整代码,并集成到自己的项目中,以便高效地处理大量图片文件。

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

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

相关文章

Postgresql主键自增的方法

Postgresql主键自增的方法 一.方法&#xff08;一&#xff09; 使用 serial PRIMARY KEY 插入数据 二.方法&#xff08;二&#xff09; &#x1f388;边走、边悟&#x1f388;迟早会好 一.方法&#xff08;一&#xff09; 使用 serial PRIMARY KEY 建表语句如下&#xf…

什么是变量提升

文章目录 发现宝藏变量提升的定义变量提升的类型变量提升的示例函数声明提升的示例注意事项 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 变量提升&#xff08;Hoisting&…

住宅IP解析:动态住宅IP和静态住宅IP区别详解

在互联网连接的世界中&#xff0c;IP地址是我们识别和访问网络资源的关键。住宅IP地址&#xff0c;特别是动态住宅IP和静态住宅IP&#xff0c;是两种不同类型的IP分配方式&#xff0c;它们在使用和功能上存在显著差异。 1. IP地址的稳定性 动态住宅IP&#xff1a;这种IP地址是…

mysql命令练习

创建数据表grade: CREATE TABLE grade( id INT NOT NULL&#xff0c; sex CHAR(1)&#xff0c; firstname VARCHAR(20) NOT NULL&#xff0c; lastname VARCHAR(20) NOT NULL&#xff0c; english FLOAT&#xff0c; math FLOAT, chinese FLOAT )&#xff1b; 向数据表grade中插…

[职场] MARKETINGSPECIALIST是什么 #笔记#微信#知识分享

MARKETINGSPECIALIST是什么 MARKETINGSPECIALIST&#xff0c;即市场营销专员&#xff0c;他们需要具备一定的专业知识和技能&#xff0c;以适应快速变化的市场环境。接下来&#xff0c;我们将详细探讨这个职位的工作内容、必备技能以及发展前景。 一、MARKETINGSPECIALIST是什么…

lua 游戏架构 之 LoaderWallet 异步加载

定义了一个名为LoaderWallet class&#xff0c;用于管理资源加载器&#xff08;Loader&#xff09;。这个类封装了资源加载的功能&#xff0c;包括异步加载&#xff0c;以及资源的释放和状态查询。下面是对代码的详细解释&#xff1a; ### 类定义和初始化 这里定义了一个名为…

WebPack5.0 快速入门

前端工程化WebPack5️⃣ 前置知识&#xff1a; 此文章属于前端——框架进阶篇&#xff0c;需要实现掌握&#xff1a;HTMLCSSJS三件套、Node... &#x1f600;推荐分享一波个人Blog文档&#xff1a; JavaScript、前端工程\模块化、邂逅Node.JS的那一夜 什么是WebPack❓ Web…

QT CNA上位机报错 解决方案

QT编译报错: -lControlCAN 解决方案 更换三个文件&#xff0c;即可解决(QT 自带的是32位库&#xff0c;应使用64位库文件)

windows下使用#include <nlohmann/json.hpp>

1.下载并解压&#xff1a;首先&#xff0c;需要从nlohmann/json的GitHub仓库下载源代码&#xff0c;并解压得到的文件。 地址&#xff1a; nlohmann/json: JSON for Modern C (github.com) https://github.com/nlohmann/json/tree/develop 2.拷贝头文件&#xff1a;解压后&a…

Kafka Producer之数据重复和乱序问题

文章目录 1. 数据重复2. 数据乱序 为了可靠性&#xff0c;Kafka有消息重试机制&#xff0c;但是同时也带来了2大问题 1. 数据重复 消息发送到broker后&#xff0c;broker记录消息数据到log中&#xff0c;但是由于网络问题&#xff0c;producer没有收到acks&#xff0c;于是再次…

【机器学习实战】Datawhale夏令营2:深度学习回顾

#DataWhale夏令营 #ai夏令营 文章目录 1. 深度学习的定义1.1 深度学习&#xff06;图神经网络1.2 机器学习和深度学习的关系 2. 深度学习的训练流程2.1 数学基础2.1.1 梯度下降法基本原理数学表达步骤学习率 α梯度下降的变体 2.1.2 神经网络与矩阵网络结构表示前向传播激活函数…

mysql如何排查死锁问题

MySQL默认的处理方式是自动检测到死锁后&#xff0c;其中一个事务会被选择为"牺牲者"并回滚&#xff0c;以解除死锁。被选择的事务会收到一个Deadlock Detected异常&#xff0c;然后回滚该事务&#xff0c;释放相关的资源&#xff0c;允许其他事务继续执行。 MySQL使…

Three.js 实战【2】—— 船模型海上场景渲染

停止了好久没有更新three这方面的文章了&#xff0c;从上两年还是vue2&#xff0c;一下子都换到vue3了&#xff0c;下面这些three都是基于vue3来进行开发的哈&#xff0c;先看一下这篇文章实现的效果哈。其中关于模型什么的资源都放在Git上了 初始化场景 安装three就直接通过n…

springboot系列十: 自定义转换器,处理JSON,内容协商

文章目录 自定义转换器基本介绍应用实例查看源码注意事项和细节 处理JSON需求说明应用实例 内容协商基本介绍应用实例debug源码优先返回xml注意事项和细节 ⬅️ 上一篇: springboot系列九: 接收参数相关注解 &#x1f389; 欢迎来到 springboot系列十: 自定义转换器&#xff0c…

ssh远程登录另一台linux电脑

大部分的博客内容所说的安装好ssh服务后&#xff0c;terminal输入 ssh -p port_number clientnameserver_ip 之后输入密码等等就可以登上别人的电脑 但是这是有一个前提的&#xff0c;就是这两台电脑要在同一个局域网下面。 如果很远呢&#xff1f; 远到不在同一个网下面怎么办…

1.JavaWeb开发简介(Tomcat安装使用+Servlet简介)

文章目录 一.web开发简介1.概念:2.特点:3.常用技术:4.服务架构5.web应用开发模式6.HTTP协议1)概念:2)HTTP最基本的过程是:3)IP/域名4)HTTP协议请求方式 7.JavaWeb的相关技术8.Java Web服务器 二、安装配置Tomcat1.简介2.Tomcat目录结构 三.Servlet的入门应用1.使用步骤2.使用注…

算法刷题笔记 字符串哈希(C++实现)

文章目录 题目描述基本思路实现代码 题目描述 给定一个长度为n的字符串&#xff0c;再给定m个询问&#xff0c;每个询问包含四个整数l1,r1,l2,r2&#xff0c;请你判断[l1,r1]和[l2,r2]这两个区间所包含的字符串子串是否完全相同。字符串中只包含大小写英文字母和数字。 输入格…

ABAP使用SQL直接更新数据库与使用IN UPDATE TASK的区别

1. 背景 刚接触ABAP的小伙伴常常会有这样的疑问&#xff0c;为什么不直接使用Open SQL直接更新数据库&#xff0c;而要把对DB的操作封装到IN UPDATE TASK中呢&#xff1f; 对于这个问题&#xff0c;比较常见的解释是&#xff0c;IN UPDATE TASK的方式会保证数据更新的一致性。…

接口开发:Orcal数据库的批量修改sql

场景&#xff1a;在日常的CURD中一定会用到批量修改。在我们的项目中&#xff0c;使用的数据库是Orcal&#xff0c;由于之前基本都是使用Mysql的&#xff0c;使用的sql语句也基本都是用mysql的。但是在这次的接口编写时用mysql的批量修改出了问题&#xff0c;刚开始我还以为是写…

如何每天不用动手就可以自动加人

只需要设置一次&#xff0c;批量导入客户号码或是微信号并设置好添加规则&#xff0c;系统就会自动进行添加。