项目实现思路
整体架构
本项目采用模块化设计,核心功能封装在独立的函数和类中,便于维护和扩展。主要包含两个版本:
- 命令行版本(image_converter.py):基于argparse和input()实现交互式和命令行两种模式
- 图形界面版本(Guiversion/image_converter_gui.py):基于tkinter实现可视化操作
核心实现思路
1. 图片格式转换
使用Pillow库处理图片格式转换,核心在于处理不同颜色模式的兼容性问题。
from PIL import Image
def convert_image(img_path, output_dir, target_format, quality=85):
# 打开图片
with Image.open(img_path) as img:
# 处理RGBA模式(带透明通道)
# 转JPEG时必须先转换为RGB,否则会报错
if img.mode == "RGBA" and target_format.lower() in ["jpg", "jpeg"]:
img = img.convert("RGB")
# 处理调色板模式
elif img.mode == "P":
img = img.convert("RGB")
# 设置保存参数
save_params = {
"format": target_format.upper(),
"quality": quality
}
# 根据格式优化参数
if target_format.lower() == "png":
save_params["optimize"] = True
elif target_format.lower() in ["jpg", "jpeg"]:
save_params["optimize"] = True
save_params["subsampling"] = 0
# 保存
img.save(output_path, **save_params)
2. 文件批量获取
根据用户选择决定是否递归遍历子目录。
import os
import glob
def get_image_files(input_dir, recursive=False):
image_extensions = [".jpg", ".jpeg", ".png", ".bmp", ".gif", ".tiff", ".tif", ".webp", ".ico"]
image_files = []
if recursive:
# 递归遍历所有子目录
for root, _, files in os.walk(input_dir):
for file in files:
if os.path.splitext(file)[1].lower() in image_extensions:
image_files.append(os.path.join(root, file))
else:
# 只获取当前目录
for ext in image_extensions:
image_files.extend(glob.glob(os.path.join(input_dir, f"*{ext}")))
return image_files
3. GUI多线程处理
图形界面版本使用多线程避免界面卡顿,通过after方法在主线程更新UI。
import threading
class ImageConverterGUI:
def start_conversion(self):
# 创建后台线程执行转换
conversion_thread = threading.Thread(
target=self.convert_batch,
args=(image_files,)
)
conversion_thread.daemon = True
conversion_thread.start()
def convert_batch(self, image_files):
for img_path in image_files:
# 执行转换
success = self.convert_image(img_path, ...)
# 在主线程更新UI
self.root.after(0, self.update_progress, success_count, fail_count)
4. 进度显示
命令行版本使用tqdm显示进度条,GUI版本使用ttk.Progressbar。
from tqdm import tqdm
# 命令行版本
for img_path in tqdm(image_files, desc="转换进度"):
convert_image(img_path, ...)
# GUI版本
self.progress_bar = ttk.Progressbar(self.progress_frame, orient=HORIZONTAL, mode='determinate')
self.progress_bar.config(value=processed_count, maximum=total_count)
关键技术点
- 颜色模式处理:RGBA转RGB、P模式转RGB,避免格式不兼容
- 多线程UI更新:使用threading.Thread和after方法保持界面响应
- 进度反馈:tqdm进度条和ttk.Progressbar提供实时反馈
- 参数校验:对输入目录、输出质量等参数进行有效性检查
- 错误处理:try-except捕获异常,记录失败文件和错误信息
扩展思路
- 支持更多图片格式
- 添加图片尺寸调整功能
- 支持批量添加水印
- 实现拖拽上传功能
- 添加历史记录功能
下载链接
【蓝奏云】批量图片处理器提取码59g7
如果喜欢就点个赞吧!
961

被折叠的 条评论
为什么被折叠?



