使用Python多线程批量压缩图片文件

在现代社会中,图片已经成为人们生活中不可或缺的一部分,在很多应用中,我们需要处理大量的图片文件,并且常常需要将它们进行压缩以减小文件大小,提高加载速度,

如何使用Python的多线程功能来批量压缩图片文件,并通过一个简单的实例代码展示了具体的操作步骤。通过并发处理,可以提高图片压缩的效率,节省时间,在实际项目中,可以根据需要调整线程数量和优化压缩算法,以达到更好的性能和用户体验。

在开始之前,我们需要安装Pillow库,它是Python中处理图片的库;

可以通过以下命令使用pip进行安装:

pip install Pillow

下面是完整的 Python 代码:

import os
from PIL import Image
from concurrent.futures import ThreadPoolExecutor
import threading# 全局变量和锁用于跟踪处理的图像数量
processed_images_count = 0
processed_images_lock = threading.Lock()def is_image_file(file):try:with Image.open(file) as img:return img.format in ['JPEG', 'PNG', 'BMP', 'GIF', 'TIFF']except IOError as e:print(f"无法打开图像文件 {file}: {e}")  # 打印错误信息和文件路径return Falsedef compress_image(input_file):global processed_images_countprint(f"正在处理图像: {input_file}")  # 添加了调试信息try:# 打开图像文件with Image.open(input_file) as img:# 获取图像的格式file_format = img.format# 保存压缩后的图像img.save(input_file, format=file_format, optimize=True)print(f"已压缩图像: {input_file}")  # 添加了调试信息except Exception as e:  # 捕获所有异常print(f"压缩图像时发生错误 {input_file}: {e}")  # 打印错误信息和文件路径# 更新已处理图像的计数器with processed_images_lock:processed_images_count += 1print(f"已成功压缩 {processed_images_count} 张图像: {input_file}")def compress_images_in_folders(thread_count):image_files = []# 遍历文件夹,找到所有图像文件for root, _, files in os.walk(os.getcwd()):print(f"正在访问文件夹: {root}")  # 打印正在访问的文件夹for file in files:input_file = os.path.join(root, file)# 检查文件扩展名_, ext = os.path.splitext(input_file)if ext.lower() in ['.jpg', '.jpeg', '.png', '.bmp', '.gif', '.tiff']:if is_image_file(input_file):image_files.append(input_file)# 使用线程池进行图像压缩with ThreadPoolExecutor(max_workers=thread_count) as executor:executor.map(compress_image, image_files)if __name__ == "__main__":thread_count = 32  # 固定线程数量为32print(f"使用 {thread_count} 个线程进行图像压缩")compress_images_in_folders(thread_count)

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

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

相关文章

高精度汽车衡的应用领域有哪些?一文说清楚

很多人不知道什么是高精度汽车衡,它其实是一种称重工具,属于称重技术的重要分支。高精度汽车衡具有精准、快速且稳定的特点,在各个领域发挥着越来越重要的作用。下面来了解一下高精度汽车衡常见的应用领域。   高精度汽车衡在工业生产中的应…

关于xilinx srio ip复位问题

关于xilinx srio ip复位问题 语言 :Verilg HDL 、VHDL EDA工具: Vivado 关于xilinx srio ip复位问题一、引言二、FPGA 之间 srio通信复位处理复位时序不同步:SRIO 模块未正确初始化:等待复位完成的时间不足:SRIO 配置…

【JS重点09】JS闭包(面试重点)

本文核心目标:阅读完本文能说出什么是闭包,闭包作用以及如何利用闭包 一:闭包概览 1 闭包是什么 闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境&#xff09…

NXP RT1060学习总结 - fsl_flexcan 基础CAN函数说明 -1

概要 CAN测试源码: https://download.csdn.net/download/qq_35671135/89425377 根据fsl_flexcan.h文件从文件末尾往前面梳理,总共30个基础CAN函数; 该文章只梳理常规CAN,增强型CAN后面再单独梳理。 使用的是RT1064开发板进行测试…

如何将接口返回/n替换为react.js中的换行符

将每个/n替换为ReactJS中的一个<br>标记。cpa_ability为后端返回的字段名

时间类:Calendar

一.Calendar概述 1.Calendar代表了系统当前时间的日历对象,可以单独修改,获取时间中的年&#xff0c;月&#xff0c;日 2.细节:Calendar是一个抽象类,不能直接创建对象。 二.获取Calendar日历类对象的方法 // 会根据系统的不同时区来获取不同的日历对象 // 会根据系统的不同…

6.每日LeetCode-数组类,找到所有数组中消失的数字(Go)

题目 448找到所有数组中消失的数字.go 给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 示例 1&#xff1a; 输入&#xff1a;nums [4,3,2,7,8,2,…

Web网页前端教程免费:引领您踏入编程的奇幻世界

Web网页前端教程免费&#xff1a;引领您踏入编程的奇幻世界 在当今数字化时代&#xff0c;Web前端技术已成为互联网发展的重要驱动力。想要踏入这一领域&#xff0c;掌握相关技能&#xff0c;却苦于找不到合适的教程&#xff1f;别担心&#xff0c;本文将为您带来一份免费的We…

双喜临门 | 两大权威报告发布,开源网安实力登榜

近日&#xff0c;开源网安凭借出色表现和实力&#xff0c;荣获两大荣誉&#xff1a;入选《中国信息安全》杂志社联合数说安全发布的《2024 年中国金融行业网络安全市场全景图》&#xff0c;并登榜安在发布的《2024安在新榜网络安全产品“大众点评”百强榜》。 2024年中国金融行…

Java开发规范

1.接口命名规范–Restful API 原本格式是动词资源by传参&#xff0c;后来进化为Restful API&#xff0c;思想是以资源为中心。 动词用get,post,put,delete请求方法代替&#xff0c;by后面的名词用传参代替。 并且GET方法传参资源ID采用路径传参&#xff0c;除了资源ID外的GET…

【智能算法应用】基于A星算法求解六边形栅格地图路径规划

目录 1.算法原理2.结果展示3.参考文献4.代码获取 1.算法原理 精准导航&#xff1a;用A*算法优化栅格地图的路径规划【附Matlab代码】 六边形栅格地图 分析一下地图&#xff1a; 六边形栅格地图上移动可以看做6领域运动&#xff0c;偶数列与奇数列移动方式有所差异&#xff0…

API技术简介与开发趋势

在当今的数字化时代&#xff0c;API&#xff08;应用程序编程接口&#xff09;技术已成为连接不同软件和服务的关键技术。API允许不同的应用程序之间进行交互&#xff0c;共享数据和功能&#xff0c;极大地提升了软件开发的效率和可扩展性。随着技术的进步和市场需求的变化&…

使用 Elasticsearch 调用 OpenAI 函数

作者&#xff1a;来自 Elastic Ashish Tiwari 介绍 OpenAI 中的函数调用是指 AI 模型与外部函数或 API 交互的能力&#xff0c;使它们能够执行文本生成之外的任务。此功能使模型能够通过调用预定义函数来执行代码、从数据库检索信息、与外部服务交互等。 该模型根据用户提示智…

连接·共享·成长:15大顶尖峰会热议AI,逾万商家聚焦实在Agent

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;和机器人流程自动化&#xff08;RPA&#xff09;正成为行业创新和效率提升的强大引擎。作为自动化领域的领航者&#xff0c;实在智能不仅在AI技术革新上保持领先地位&#xff0c;更通过一系列行业活动&…

[13] CUDA_Opencv联合编译过程

CUDA_Opencv联合编译过程 详细编译过程可见我之前的文章&#xff1a;Win10下OpencvCUDA联合编译详细教程&#xff08;版本455、460、470,亲测可用&#xff01;&#xff01;&#xff01;&#xff09;本文给出Windows\linux下的opencvcuda的编译总结&#xff0c;摘自 <基于GP…

[面试题]Java【虚拟机】

[面试题]Java【基础】[面试题]Java【虚拟机】 因为 Java 并发涉及到的内容会非常多&#xff0c;本面试题可能很难覆盖到所有的知识点&#xff0c;所以推荐 《深入拆解 Java 虚拟机》 。 走近 Java 什么是虚拟机&#xff1f; Java 虚拟机&#xff0c;是一个可以执行 Java 字…

Pygame的基本应用

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 Pygame有很多模块&#xff0c;每个模块又有很多方法&#xff0c;在此不能够逐一讲解&#xff0c;所以&#xff0c;我们通过一个实例来学习Pygame&…

异界传说-如何应对甲方提出的不合理需求

在科技仙域中&#xff0c;有个灵犀宗的宗派&#xff0c;弟子们以精湛的技艺和卓越的智慧&#xff0c;为修仙者们提供各种神奇的软件。然而&#xff0c;在项目开发过程中&#xff0c;他们常常会遇到用户提出的不合理需求。面对这些需求&#xff0c;灵犀宗的弟子们总能凭借智慧和…

学习分享-Callable 和 Runnable 任务

前言 顺带回顾学习一下Callable 或 Runnable 任务 Callable 和 Runnable 任务 Callable 和 Runnable 是 Java 中用于定义任务的接口&#xff0c;它们主要用于并发编程&#xff0c;允许任务在独立的线程中运行。 Runnable 任务 Runnable 是一个函数式接口&#xff0c;只包含…

NumPy 舍入小数、对数、求和和乘积运算详解

舍入小数 在 NumPy 中&#xff0c;主要有五种方法来舍入小数&#xff1a; 截断 去除小数部分&#xff0c;并返回最接近零的浮点数。使用 trunc() 和 fix() 函数。 示例&#xff1a; import numpy as nparr np.trunc([-3.1666, 3.6667])print(arr)相同的示例&#xff0c;使…