当前位置: 首页 > news >正文

使用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)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 23种设计模式之组合模式
  • 什么是电脑监控软件?六款知名又实用的电脑监控软件
  • ONLYOFFICE协作空间与Drupal如何集成
  • 嵌入式学习——Linux高级编程复习(网络编程)——day42
  • 聊聊C/S模式架构的优缺点
  • 掌握Excel字符串拼接
  • RabbitMQ-topic exchange使用方法
  • NLP——电影评论情感分析
  • nginx配置https协议(测试环境)
  • PDF格式分析(八十五)——水印注释(Watermark)
  • 如何开发一个直播APP:功能介绍与开发步骤详解
  • 实时通信websocket和sse
  • 关于自学编程的9点忠告
  • 【BeX5】知识中心
  • Android启动流程
  • Android开源项目规范总结
  • Django 博客开发教程 16 - 统计文章阅读量
  • Flannel解读
  • HTTP中GET与POST的区别 99%的错误认识
  • js操作时间(持续更新)
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Unix命令
  • vue脚手架vue-cli
  • 入口文件开始,分析Vue源码实现
  • 算法-图和图算法
  • 我看到的前端
  • 线性表及其算法(java实现)
  • 异常机制详解
  • 终端用户监控:真实用户监控还是模拟监控?
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • $jQuery 重写Alert样式方法
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (done) 两个矩阵 “相似” 是什么意思?
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)我也是一只IT小小鸟
  • (转)原始图像数据和PDF中的图像数据
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net CF下精确的计时器
  • .Net7 环境安装配置
  • /3GB和/USERVA开关
  • ::before和::after 常见的用法
  • @Transactional 参数详解
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [000-01-022].第06节:RabbitMQ中的交换机介绍
  • [10] CUDA程序性能的提升 与 流
  • [Android]创建TabBar
  • [CC2642R1][VSCODE+Embedded IDE+IAR Build+Cortex-Debug] TI CC2642R1基于VsCode的开发环境