编写一个Python脚本以批量压缩图片,保留图片的关键信息,并利用线程池或进程池提高处理效率。
时间: 2024-11-28 18:24:51 浏览: 14
在处理大量图片压缩任务时,编写一个高效且能够保留图片关键信息的Python脚本是十分有用的。这不仅能够节省存储空间,还能确保图片的元数据不被丢失。以下是如何实现这个脚本的详细步骤:
参考资源链接:[Python批量无损压缩图片脚本实现](https://wenku.csdn.net/doc/5bwun7113w?spm=1055.2569.3001.10343)
1. **环境准备**:确保你的Python环境中已经安装了`requests`, `concurrent.futures`, `os`, `json`等库,这些库将用于发送网络请求、并行处理和文件操作。
2. **脚本逻辑**:
- 使用`os`库遍历指定目录下的所有文件。
- 利用`os.path.splitext`方法检查每个文件的后缀,确保只有PNG和JPEG格式的图片被处理。
- 使用`requests`库作为HTTP客户端向tinypng API发送压缩请求。
- 通过`concurrent.futures`中的`ThreadPoolExecutor`或`ProcessPoolExecutor`来创建线程池或进程池,实现并行压缩,从而提升处理速度。
- 将压缩后的图片保存到新文件中,并保留原始文件名后缀。
3. **代码实现**:
```python
import os
import requests
from concurrent.futures import ThreadPoolExecutor
def get_file_dir(file):
# 返回文件的完整路径
return os.path.abspath(file)
def check_suffix(file_path):
# 检查文件后缀是否为.jpg或.png
return file_path.endswith(('.png', '.jpg'))
def download_tinypng(input_file, url, output_file):
# 调用tinypng API进行压缩并保存
with open(input_file, 'rb') as f:
files = {'file': (input_file, f)}
response = requests.post(url, files=files)
if response.status_code == 200:
with open(output_file, 'wb') as f:
f.write(response.content)
def compress_files(directory):
with ThreadPoolExecutor(max_workers=10) as executor:
for file in os.listdir(directory):
file_path = get_file_dir(file)
if check_suffix(file_path):
output_file = f
参考资源链接:[Python批量无损压缩图片脚本实现](https://wenku.csdn.net/doc/5bwun7113w?spm=1055.2569.3001.10343)
阅读全文