【全格式图片转换器】批量图片处理器-离线-python实现-命令行接口-附下载

项目实现思路

整体架构

本项目采用模块化设计,核心功能封装在独立的函数和类中,便于维护和扩展。主要包含两个版本:

  1. 命令行版本(image_converter.py):基于argparse和input()实现交互式和命令行两种模式
  2. 图形界面版本(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)

关键技术点

  1. 颜色模式处理:RGBA转RGB、P模式转RGB,避免格式不兼容
  2. 多线程UI更新:使用threading.Thread和after方法保持界面响应
  3. 进度反馈:tqdm进度条和ttk.Progressbar提供实时反馈
  4. 参数校验:对输入目录、输出质量等参数进行有效性检查
  5. 错误处理:try-except捕获异常,记录失败文件和错误信息

扩展思路

  • 支持更多图片格式
  • 添加图片尺寸调整功能
  • 支持批量添加水印
  • 实现拖拽上传功能
  • 添加历史记录功能

下载链接

【蓝奏云】批量图片处理器提取码59g7
如果喜欢就点个赞吧!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值