欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Python實(shí)現(xiàn)圖片格式批量轉(zhuǎn)換器

 更新時(shí)間:2025年06月11日 09:04:08   作者:笨笨輕松熊  
這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)圖片格式批量轉(zhuǎn)換器,支持多種常見圖片格式之間的轉(zhuǎn)換(JPG,?PNG,?BMP,?GIF,?TIFF等),需要的可以參考下

開發(fā)環(huán)境準(zhǔn)備

Python 3.6+

Pillow庫(kù) (PIL的fork版本)

安裝Pillow庫(kù):

pip install pillow

核心功能

支持多種常見圖片格式之間的轉(zhuǎn)換(JPG, PNG, BMP, GIF, TIFF等)

批量處理指定文件夾中的所有圖片

可選擇保留原始圖片或僅保留轉(zhuǎn)換后的圖片

支持調(diào)整圖片質(zhì)量和大小

簡(jiǎn)單的命令行界面和圖形用戶界面(GUI)兩種使用方式

技術(shù)要點(diǎn)

1. Pillow庫(kù)基礎(chǔ)

Pillow是Python圖像處理庫(kù)(PIL)的一個(gè)分支,提供了豐富的圖像處理功能。主要用到的模塊:

  • Image: 圖像對(duì)象的創(chuàng)建、讀取和保存
  • ImageOps: 圖像操作,如調(diào)整大小、翻轉(zhuǎn)等
  • ImageEnhance: 圖像增強(qiáng),如亮度、對(duì)比度調(diào)整

2. 文件系統(tǒng)操作

使用os和pathlib模塊處理文件路徑

遞歸遍歷目錄

文件類型判斷

3. 用戶界面

命令行參數(shù)解析

簡(jiǎn)單GUI界面構(gòu)建(使用tkinter)

代碼實(shí)現(xiàn)與解析

1. 導(dǎo)入必要的庫(kù)

from PIL import Image
import os
import sys
import argparse
from pathlib import Path
import tkinter as tk
from tkinter import filedialog, messagebox, ttk

知識(shí)點(diǎn):

PIL.Image: Pillow的核心模塊,用于圖像處理

os和pathlib: 文件系統(tǒng)操作

argparse: 命令行參數(shù)解析

tkinter: Python標(biāo)準(zhǔn)GUI庫(kù)

2. 圖片格式轉(zhuǎn)換核心函數(shù)

def convert_image(input_path, output_path, format, quality=95, resize=None):
    """
    轉(zhuǎn)換單個(gè)圖片的格式
    
    參數(shù):
    input_path - 輸入圖片路徑
    output_path - 輸出圖片路徑
    format - 目標(biāo)格式 (如 'JPEG', 'PNG')
    quality - 圖片質(zhì)量 (1-100, 僅對(duì)JPEG格式有效)
    resize - 調(diào)整大小的元組 (width, height) 或 None
    
    返回:
    bool - 轉(zhuǎn)換是否成功
    """
    try:
        # 打開圖片
        img = Image.open(input_path)
        
        # 如果是RGBA模式且轉(zhuǎn)換為JPEG,需要轉(zhuǎn)換為RGB模式
        if img.mode == 'RGBA' and format.upper() == 'JPEG':
            img = img.convert('RGB')
        
        # 調(diào)整大小
        if resize:
            img = img.resize(resize, Image.LANCZOS)
        
        # 保存轉(zhuǎn)換后的圖片
        if format.upper() == 'JPEG':
            img.save(output_path, format=format, quality=quality)
        else:
            img.save(output_path, format=format)
        
        return True
    except Exception as e:
        print(f"轉(zhuǎn)換圖片 {input_path} 時(shí)出錯(cuò): {e}")
        return False

知識(shí)點(diǎn):

Image.open(): 打開圖片文件

圖像模式轉(zhuǎn)換: RGBA轉(zhuǎn)RGB(JPEG不支持透明通道)

Image.LANCZOS: 高質(zhì)量的圖像縮放算法

異常處理: 捕獲并處理可能的錯(cuò)誤

3. 批量轉(zhuǎn)換功能

def batch_convert(input_dir, output_dir, target_format, quality=95, 
                 resize=None, recursive=False, keep_original=True):
    """
    批量轉(zhuǎn)換指定目錄中的圖片
    
    參數(shù):
    input_dir - 輸入目錄
    output_dir - 輸出目錄
    target_format - 目標(biāo)格式
    quality - 圖片質(zhì)量
    resize - 調(diào)整大小的元組
    recursive - 是否遞歸處理子目錄
    keep_original - 是否保留原始圖片
    
    返回:
    tuple - (成功數(shù)量, 失敗數(shù)量)
    """
    # 支持的圖片格式
    supported_formats = ['.jpg', '.jpeg', '.png', '.bmp', '.gif', '.tiff']
    
    # 創(chuàng)建輸出目錄
    os.makedirs(output_dir, exist_ok=True)
    
    success_count = 0
    failed_count = 0
    
    # 遍歷目錄
    for root, dirs, files in os.walk(input_dir):
        # 如果不遞歸處理子目錄且不是根目錄,則跳過
        if not recursive and root != input_dir:
            continue
            
        # 創(chuàng)建對(duì)應(yīng)的輸出子目錄
        rel_path = os.path.relpath(root, input_dir)
        if rel_path != '.':
            current_output_dir = os.path.join(output_dir, rel_path)
            os.makedirs(current_output_dir, exist_ok=True)
        else:
            current_output_dir = output_dir
        
        # 處理文件
        for file in files:
            # 檢查文件擴(kuò)展名
            ext = os.path.splitext(file)[1].lower()
            if ext not in supported_formats:
                continue
                
            # 構(gòu)建輸入和輸出路徑
            input_path = os.path.join(root, file)
            output_filename = os.path.splitext(file)[0] + '.' + target_format.lower()
            output_path = os.path.join(current_output_dir, output_filename)
            
            # 轉(zhuǎn)換圖片
            if convert_image(input_path, output_path, target_format, quality, resize):
                success_count += 1
                # 如果不保留原始圖片且不是在原目錄操作,則刪除原始圖片
                if not keep_original and input_dir != output_dir:
                    try:
                        os.remove(input_path)
                    except:
                        pass
            else:
                failed_count += 1
    
    return (success_count, failed_count)

知識(shí)點(diǎn):

os.walk(): 遞歸遍歷目錄

os.path.relpath(): 獲取相對(duì)路徑

os.makedirs(): 創(chuàng)建多級(jí)目錄

文件擴(kuò)展名處理: 使用os.path.splitext()分離文件名和擴(kuò)展名

4. 命令行界面

def setup_cli():
    """設(shè)置命令行參數(shù)解析器"""
    parser = argparse.ArgumentParser(description='批量轉(zhuǎn)換圖片格式')
    
    parser.add_argument('input', help='輸入目錄或文件')
    parser.add_argument('output', help='輸出目錄')
    parser.add_argument('format', help='目標(biāo)格式 (如: jpg, png, bmp)')
    parser.add_argument('-q', '--quality', type=int, default=95, 
                        help='圖片質(zhì)量 (1-100, 默認(rèn): 95)')
    parser.add_argument('-r', '--recursive', action='store_true', 
                        help='遞歸處理子目錄')
    parser.add_argument('-k', '--keep', action='store_true', 
                        help='保留原始圖片')
    parser.add_argument('--resize', nargs=2, type=int, metavar=('WIDTH', 'HEIGHT'),
                        help='調(diào)整圖片大小')
    
    return parser.parse_args()

知識(shí)點(diǎn):

argparse: 命令行參數(shù)解析

參數(shù)類型: 位置參數(shù)、可選參數(shù)、標(biāo)志參數(shù)

參數(shù)類型轉(zhuǎn)換: 使用type=int將字符串轉(zhuǎn)換為整數(shù)

5. 圖形用戶界面

class ImageConverterGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("圖片格式批量轉(zhuǎn)換器")
        self.root.geometry("600x450")
        self.root.resizable(True, True)
        
        # 創(chuàng)建主框架
        main_frame = ttk.Frame(root, padding="10")
        main_frame.pack(fill=tk.BOTH, expand=True)
        
        # 輸入目錄
        ttk.Label(main_frame, text="輸入目錄:").grid(column=0, row=0, sticky=tk.W, pady=5)
        self.input_dir = tk.StringVar()
        ttk.Entry(main_frame, width=50, textvariable=self.input_dir).grid(column=1, row=0, pady=5)
        ttk.Button(main_frame, text="瀏覽...", command=self.browse_input).grid(column=2, row=0, padx=5, pady=5)
        
        # 輸出目錄
        ttk.Label(main_frame, text="輸出目錄:").grid(column=0, row=1, sticky=tk.W, pady=5)
        self.output_dir = tk.StringVar()
        ttk.Entry(main_frame, width=50, textvariable=self.output_dir).grid(column=1, row=1, pady=5)
        ttk.Button(main_frame, text="瀏覽...", command=self.browse_output).grid(column=2, row=1, padx=5, pady=5)
        
        # 目標(biāo)格式
        ttk.Label(main_frame, text="目標(biāo)格式:").grid(column=0, row=2, sticky=tk.W, pady=5)
        self.format_var = tk.StringVar(value="JPEG")
        formats = ["JPEG", "PNG", "BMP", "GIF", "TIFF"]
        ttk.Combobox(main_frame, textvariable=self.format_var, values=formats, width=10).grid(column=1, row=2, sticky=tk.W, pady=5)
        
        # 圖片質(zhì)量
        ttk.Label(main_frame, text="圖片質(zhì)量:").grid(column=0, row=3, sticky=tk.W, pady=5)
        self.quality_var = tk.IntVar(value=95)
        quality_frame = ttk.Frame(main_frame)
        quality_frame.grid(column=1, row=3, sticky=tk.W, pady=5)
        ttk.Scale(quality_frame, from_=1, to=100, variable=self.quality_var, orient=tk.HORIZONTAL, length=200).pack(side=tk.LEFT)
        ttk.Label(quality_frame, textvariable=self.quality_var).pack(side=tk.LEFT, padx=5)
        
        # 調(diào)整大小
        ttk.Label(main_frame, text="調(diào)整大小:").grid(column=0, row=4, sticky=tk.W, pady=5)
        resize_frame = ttk.Frame(main_frame)
        resize_frame.grid(column=1, row=4, sticky=tk.W, pady=5)
        self.resize_enabled = tk.BooleanVar(value=False)
        ttk.Checkbutton(resize_frame, text="啟用", variable=self.resize_enabled).pack(side=tk.LEFT)
        ttk.Label(resize_frame, text="寬:").pack(side=tk.LEFT, padx=(10, 0))
        self.width_var = tk.IntVar(value=800)
        ttk.Entry(resize_frame, width=5, textvariable=self.width_var).pack(side=tk.LEFT, padx=(0, 5))
        ttk.Label(resize_frame, text="高:").pack(side=tk.LEFT)
        self.height_var = tk.IntVar(value=600)
        ttk.Entry(resize_frame, width=5, textvariable=self.height_var).pack(side=tk.LEFT)
        
        # 遞歸處理
        self.recursive_var = tk.BooleanVar(value=False)
        ttk.Checkbutton(main_frame, text="遞歸處理子目錄", variable=self.recursive_var).grid(column=1, row=5, sticky=tk.W, pady=5)
        
        # 保留原始圖片
        self.keep_original_var = tk.BooleanVar(value=True)
        ttk.Checkbutton(main_frame, text="保留原始圖片", variable=self.keep_original_var).grid(column=1, row=6, sticky=tk.W, pady=5)
        
        # 轉(zhuǎn)換按鈕
        ttk.Button(main_frame, text="開始轉(zhuǎn)換", command=self.start_conversion).grid(column=1, row=7, pady=10)
        
        # 進(jìn)度條
        self.progress_var = tk.DoubleVar()
        ttk.Progressbar(main_frame, variable=self.progress_var, maximum=100).grid(column=0, row=8, columnspan=3, sticky=(tk.W, tk.E), pady=5)
        
        # 狀態(tài)標(biāo)簽
        self.status_var = tk.StringVar(value="就緒")
        ttk.Label(main_frame, textvariable=self.status_var).grid(column=0, row=9, columnspan=3, sticky=tk.W, pady=5)
        
    def browse_input(self):
        directory = filedialog.askdirectory()
        if directory:
            self.input_dir.set(directory)
            
    def browse_output(self):
        directory = filedialog.askdirectory()
        if directory:
            self.output_dir.set(directory)
    
    def start_conversion(self):
        input_dir = self.input_dir.get()
        output_dir = self.output_dir.get()
        target_format = self.format_var.get()
        quality = self.quality_var.get()
        recursive = self.recursive_var.get()
        keep_original = self.keep_original_var.get()
        
        # 檢查輸入
        if not input_dir or not output_dir:
            messagebox.showerror("錯(cuò)誤", "請(qǐng)指定輸入和輸出目錄")
            return
            
        # 檢查調(diào)整大小參數(shù)
        resize = None
        if self.resize_enabled.get():
            try:
                width = self.width_var.get()
                height = self.height_var.get()
                if width <= 0 or height <= 0:
                    raise ValueError("寬度和高度必須大于0")
                resize = (width, height)
            except:
                messagebox.showerror("錯(cuò)誤", "調(diào)整大小參數(shù)無(wú)效")
                return
        
        # 開始轉(zhuǎn)換
        self.status_var.set("轉(zhuǎn)換中...")
        self.root.update()
        
        try:
            success, failed = batch_convert(
                input_dir, output_dir, target_format, quality,
                resize, recursive, keep_original
            )
            
            self.status_var.set(f"轉(zhuǎn)換完成。成功: {success}, 失敗: {failed}")
            messagebox.showinfo("完成", f"轉(zhuǎn)換完成\n成功: {success}\n失敗: {failed}")
        except Exception as e:
            self.status_var.set(f"轉(zhuǎn)換出錯(cuò): {str(e)}")
            messagebox.showerror("錯(cuò)誤", f"轉(zhuǎn)換過程中出錯(cuò):\n{str(e)}")

知識(shí)點(diǎn):

tkinter: Python標(biāo)準(zhǔn)GUI庫(kù)

布局管理: 使用grid布局

控件使用: 標(biāo)簽、輸入框、按鈕、復(fù)選框、組合框、進(jìn)度條等

事件處理: 按鈕點(diǎn)擊事件

文件對(duì)話框: 使用filedialog選擇目錄

6. 主函數(shù)

def main():
    # 檢查是否有命令行參數(shù)
    if len(sys.argv) > 1:
        # 命令行模式
        args = setup_cli()
        
        # 檢查輸入和輸出目錄
        if not os.path.exists(args.input):
            print(f"錯(cuò)誤: 輸入路徑 '{args.input}' 不存在")
            return
            
        # 調(diào)整大小參數(shù)
        resize = tuple(args.resize) if args.resize else None
        
        # 開始轉(zhuǎn)換
        print(f"開始轉(zhuǎn)換圖片從 {args.input} 到 {args.output},格式: {args.format}")
        success, failed = batch_convert(
            args.input, args.output, args.format.upper(),
            args.quality, resize, args.recursive, args.keep
        )
        
        print(f"轉(zhuǎn)換完成。成功: {success}, 失敗: {failed}")
    else:
        # GUI模式
        root = tk.Tk()
        app = ImageConverterGUI(root)
        root.mainloop()

???????if __name__ == "__main__":
    main()

完整代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
圖片格式批量轉(zhuǎn)換器
功能: 批量將圖片從一種格式轉(zhuǎn)換為另一種格式,支持調(diào)整大小和質(zhì)量
作者: Python開發(fā)者
"""

from PIL import Image
import os
import sys
import argparse
from pathlib import Path
import tkinter as tk
from tkinter import filedialog, messagebox, ttk


def convert_image(input_path, output_path, format, quality=95, resize=None):
    """
    轉(zhuǎn)換單個(gè)圖片的格式

    參數(shù):
    input_path - 輸入圖片路徑
    output_path - 輸出圖片路徑
    format - 目標(biāo)格式 (如 'JPEG', 'PNG')
    quality - 圖片質(zhì)量 (1-100, 僅對(duì)JPEG格式有效)
    resize - 調(diào)整大小的元組 (width, height) 或 None

    返回:
    bool - 轉(zhuǎn)換是否成功
    """
    try:
        # 打開圖片
        img = Image.open(input_path)

        # 如果是RGBA模式且轉(zhuǎn)換為JPEG,需要轉(zhuǎn)換為RGB模式
        if img.mode == 'RGBA' and format.upper() == 'JPEG':
            img = img.convert('RGB')

        # 調(diào)整大小
        if resize:
            img = img.resize(resize, Image.LANCZOS)

        # 保存轉(zhuǎn)換后的圖片
        if format.upper() == 'JPEG':
            img.save(output_path, format=format, quality=quality)
        else:
            img.save(output_path, format=format)

        return True
    except Exception as e:
        print(f"轉(zhuǎn)換圖片 {input_path} 時(shí)出錯(cuò): {e}")
        return False


def batch_convert(input_dir, output_dir, target_format, quality=95,
                  resize=None, recursive=False, keep_original=True):
    """
    批量轉(zhuǎn)換指定目錄中的圖片

    參數(shù):
    input_dir - 輸入目錄
    output_dir - 輸出目錄
    target_format - 目標(biāo)格式
    quality - 圖片質(zhì)量
    resize - 調(diào)整大小的元組
    recursive - 是否遞歸處理子目錄
    keep_original - 是否保留原始圖片

    返回:
    tuple - (成功數(shù)量, 失敗數(shù)量)
    """
    # 支持的圖片格式
    supported_formats = ['.jpg', '.jpeg', '.png', '.bmp', '.gif', '.tiff']

    # 創(chuàng)建輸出目錄
    os.makedirs(output_dir, exist_ok=True)

    success_count = 0
    failed_count = 0

    # 遍歷目錄
    for root, dirs, files in os.walk(input_dir):
        # 如果不遞歸處理子目錄且不是根目錄,則跳過
        if not recursive and root != input_dir:
            continue

        # 創(chuàng)建對(duì)應(yīng)的輸出子目錄
        rel_path = os.path.relpath(root, input_dir)
        if rel_path != '.':
            current_output_dir = os.path.join(output_dir, rel_path)
            os.makedirs(current_output_dir, exist_ok=True)
        else:
            current_output_dir = output_dir

        # 處理文件
        for file in files:
            # 檢查文件擴(kuò)展名
            ext = os.path.splitext(file)[1].lower()
            if ext not in supported_formats:
                continue

            # 構(gòu)建輸入和輸出路徑
            input_path = os.path.join(root, file)
            output_filename = os.path.splitext(file)[0] + '.' + target_format.lower()
            output_path = os.path.join(current_output_dir, output_filename)

            # 轉(zhuǎn)換圖片
            if convert_image(input_path, output_path, target_format, quality, resize):
                success_count += 1
                # 如果不保留原始圖片且不是在原目錄操作,則刪除原始圖片
                if not keep_original and input_dir != output_dir:
                    try:
                        os.remove(input_path)
                    except:
                        pass
            else:
                failed_count += 1

    return (success_count, failed_count)


def setup_cli():
    """設(shè)置命令行參數(shù)解析器"""
    parser = argparse.ArgumentParser(description='批量轉(zhuǎn)換圖片格式')

    parser.add_argument('input', help='輸入目錄或文件')
    parser.add_argument('output', help='輸出目錄')
    parser.add_argument('format', help='目標(biāo)格式 (如: jpg, png, bmp)')
    parser.add_argument('-q', '--quality', type=int, default=95,
                        help='圖片質(zhì)量 (1-100, 默認(rèn): 95)')
    parser.add_argument('-r', '--recursive', action='store_true',
                        help='遞歸處理子目錄')
    parser.add_argument('-k', '--keep', action='store_true',
                        help='保留原始圖片')
    parser.add_argument('--resize', nargs=2, type=int, metavar=('WIDTH', 'HEIGHT'),
                        help='調(diào)整圖片大小')

    return parser.parse_args()


class ImageConverterGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("圖片格式批量轉(zhuǎn)換器")
        self.root.geometry("600x450")
        self.root.resizable(True, True)

        # 創(chuàng)建主框架
        main_frame = ttk.Frame(root, padding="10")
        main_frame.pack(fill=tk.BOTH, expand=True)

        # 輸入目錄
        ttk.Label(main_frame, text="輸入目錄:").grid(column=0, row=0, sticky=tk.W, pady=5)
        self.input_dir = tk.StringVar()
        ttk.Entry(main_frame, width=50, textvariable=self.input_dir).grid(column=1, row=0, pady=5)
        ttk.Button(main_frame, text="瀏覽...", command=self.browse_input).grid(column=2, row=0, padx=5, pady=5)

        # 輸出目錄
        ttk.Label(main_frame, text="輸出目錄:").grid(column=0, row=1, sticky=tk.W, pady=5)
        self.output_dir = tk.StringVar()
        ttk.Entry(main_frame, width=50, textvariable=self.output_dir).grid(column=1, row=1, pady=5)
        ttk.Button(main_frame, text="瀏覽...", command=self.browse_output).grid(column=2, row=1, padx=5, pady=5)

        # 目標(biāo)格式
        ttk.Label(main_frame, text="目標(biāo)格式:").grid(column=0, row=2, sticky=tk.W, pady=5)
        self.format_var = tk.StringVar(value="JPEG")
        formats = ["JPEG", "PNG", "BMP", "GIF", "TIFF"]
        ttk.Combobox(main_frame, textvariable=self.format_var, values=formats, width=10).grid(column=1, row=2,
                                                                                              sticky=tk.W, pady=5)

        # 圖片質(zhì)量
        ttk.Label(main_frame, text="圖片質(zhì)量:").grid(column=0, row=3, sticky=tk.W, pady=5)
        self.quality_var = tk.IntVar(value=95)
        quality_frame = ttk.Frame(main_frame)
        quality_frame.grid(column=1, row=3, sticky=tk.W, pady=5)
        ttk.Scale(quality_frame, from_=1, to=100, variable=self.quality_var, orient=tk.HORIZONTAL, length=200).pack(
            side=tk.LEFT)
        ttk.Label(quality_frame, textvariable=self.quality_var).pack(side=tk.LEFT, padx=5)

        # 調(diào)整大小
        ttk.Label(main_frame, text="調(diào)整大小:").grid(column=0, row=4, sticky=tk.W, pady=5)
        resize_frame = ttk.Frame(main_frame)
        resize_frame.grid(column=1, row=4, sticky=tk.W, pady=5)
        self.resize_enabled = tk.BooleanVar(value=False)
        ttk.Checkbutton(resize_frame, text="啟用", variable=self.resize_enabled).pack(side=tk.LEFT)
        ttk.Label(resize_frame, text="寬:").pack(side=tk.LEFT, padx=(10, 0))
        self.width_var = tk.IntVar(value=800)
        ttk.Entry(resize_frame, width=5, textvariable=self.width_var).pack(side=tk.LEFT, padx=(0, 5))
        ttk.Label(resize_frame, text="高:").pack(side=tk.LEFT)
        self.height_var = tk.IntVar(value=600)
        ttk.Entry(resize_frame, width=5, textvariable=self.height_var).pack(side=tk.LEFT)

        # 遞歸處理
        self.recursive_var = tk.BooleanVar(value=False)
        ttk.Checkbutton(main_frame, text="遞歸處理子目錄", variable=self.recursive_var).grid(column=1, row=5,
                                                                                             sticky=tk.W, pady=5)

        # 保留原始圖片
        self.keep_original_var = tk.BooleanVar(value=True)
        ttk.Checkbutton(main_frame, text="保留原始圖片", variable=self.keep_original_var).grid(column=1, row=6,
                                                                                               sticky=tk.W, pady=5)

        # 轉(zhuǎn)換按鈕
        ttk.Button(main_frame, text="開始轉(zhuǎn)換", command=self.start_conversion).grid(column=1, row=7, pady=10)

        # 進(jìn)度條
        self.progress_var = tk.DoubleVar()
        ttk.Progressbar(main_frame, variable=self.progress_var, maximum=100).grid(column=0, row=8, columnspan=3,
                                                                                  sticky=(tk.W, tk.E), pady=5)

        # 狀態(tài)標(biāo)簽
        self.status_var = tk.StringVar(value="就緒")
        ttk.Label(main_frame, textvariable=self.status_var).grid(column=0, row=9, columnspan=3, sticky=tk.W, pady=5)

    def browse_input(self):
        directory = filedialog.askdirectory()
        if directory:
            self.input_dir.set(directory)

    def browse_output(self):
        directory = filedialog.askdirectory()
        if directory:
            self.output_dir.set(directory)

    def start_conversion(self):
        input_dir = self.input_dir.get()
        output_dir = self.output_dir.get()
        target_format = self.format_var.get()
        quality = self.quality_var.get()
        recursive = self.recursive_var.get()
        keep_original = self.keep_original_var.get()

        # 檢查輸入
        if not input_dir or not output_dir:
            messagebox.showerror("錯(cuò)誤", "請(qǐng)指定輸入和輸出目錄")
            return

        # 檢查調(diào)整大小參數(shù)
        resize = None
        if self.resize_enabled.get():
            try:
                width = self.width_var.get()
                height = self.height_var.get()
                if width <= 0 or height <= 0:
                    raise ValueError("寬度和高度必須大于0")
                resize = (width, height)
            except:
                messagebox.showerror("錯(cuò)誤", "調(diào)整大小參數(shù)無(wú)效")
                return

        # 開始轉(zhuǎn)換
        self.status_var.set("轉(zhuǎn)換中...")
        self.root.update()

        try:
            success, failed = batch_convert(
                input_dir, output_dir, target_format, quality,
                resize, recursive, keep_original
            )

            self.status_var.set(f"轉(zhuǎn)換完成。成功: {success}, 失敗: {failed}")
            messagebox.showinfo("完成", f"轉(zhuǎn)換完成\n成功: {success}\n失敗: {failed}")
        except Exception as e:
            self.status_var.set(f"轉(zhuǎn)換出錯(cuò): {str(e)}")
            messagebox.showerror("錯(cuò)誤", f"轉(zhuǎn)換過程中出錯(cuò):\n{str(e)}")


def main():
    # 檢查是否有命令行參數(shù)
    if len(sys.argv) > 1:
        # 命令行模式
        args = setup_cli()

        # 檢查輸入和輸出目錄
        if not os.path.exists(args.input):
            print(f"錯(cuò)誤: 輸入路徑 '{args.input}' 不存在")
            return

        # 調(diào)整大小參數(shù)
        resize = tuple(args.resize) if args.resize else None

        # 開始轉(zhuǎn)換
        print(f"開始轉(zhuǎn)換圖片從 {args.input} 到 {args.output},格式: {args.format}")
        success, failed = batch_convert(
            args.input, args.output, args.format.upper(),
            args.quality, resize, args.recursive, args.keep
        )

        print(f"轉(zhuǎn)換完成。成功: {success}, 失敗: {failed}")
    else:
        # GUI模式
        root = tk.Tk()
        app = ImageConverterGUI(root)
        root.mainloop()


if __name__ == "__main__":
    main()

知識(shí)點(diǎn):

命令行模式和GUI模式的切換

sys.argv: 獲取命令行參數(shù)

tkinter主循環(huán): root.mainloop()

使用方法

命令行方式

# 基本用法
python image_converter.py 輸入目錄 輸出目錄 目標(biāo)格式

# 示例: 將input_folder中的圖片轉(zhuǎn)換為PNG格式并保存到output_folder
python image_converter.py input_folder output_folder png

# 高級(jí)用法
python image_converter.py input_folder output_folder jpg -q 85 -r --resize 800 600

GUI方式

直接運(yùn)行程序,不帶任何參數(shù):

python image_converter.py

然后在圖形界面中:

  • 選擇輸入目錄
  • 選擇輸出目錄
  • 設(shè)置目標(biāo)格式和其他選項(xiàng)
  • 點(diǎn)擊"開始轉(zhuǎn)換"按鈕

進(jìn)階知識(shí)點(diǎn)

1. 圖像處理基礎(chǔ)

像素: 圖像的基本單位

顏色模式: RGB, RGBA, CMYK, 灰度等

圖像格式特點(diǎn):

  • JPEG: 有損壓縮,不支持透明度,適合照片
  • PNG: 無(wú)損壓縮,支持透明度,適合圖標(biāo)和截圖
  • GIF: 支持動(dòng)畫,有限的顏色數(shù)量
  • BMP: 無(wú)壓縮,文件較大
  • TIFF: 高質(zhì)量,支持多頁(yè),常用于專業(yè)印刷

2. Pillow高級(jí)特性

  • 圖像增強(qiáng): 亮度、對(duì)比度、銳化等調(diào)整
  • 濾鏡效果: 模糊、銳化、邊緣檢測(cè)等
  • 圖像合成: 圖層混合、水印等
  • 批處理: 多進(jìn)程處理提高效率

3. 性能優(yōu)化

  • 使用生成器減少內(nèi)存占用
  • 多線程/多進(jìn)程處理提高轉(zhuǎn)換速度
  • 縮略圖生成優(yōu)化

可擴(kuò)展功能

批量水印添加:為圖片添加文字或圖片水印

圖片批量裁剪:自動(dòng)裁剪圖片到指定比例或尺寸

批量圖片優(yōu)化:自動(dòng)調(diào)整亮度、對(duì)比度和圖片銳化

批量重命名:根據(jù)規(guī)則批量重命名圖片文件

元數(shù)據(jù)處理:保留或清除EXIF信息

到此這篇關(guān)于基于Python實(shí)現(xiàn)圖片格式批量轉(zhuǎn)換器的文章就介紹到這了,更多相關(guān)Python圖片格式轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python制作簡(jiǎn)易聊天器,搭建UDP網(wǎng)絡(luò)通信模型

    Python制作簡(jiǎn)易聊天器,搭建UDP網(wǎng)絡(luò)通信模型

    這篇文章主要介紹了Python制作簡(jiǎn)易聊天器,搭建UDP網(wǎng)絡(luò)通信模型,用UDP建立網(wǎng)絡(luò)模型來(lái)完成一個(gè)簡(jiǎn)單的聊天器,感興趣的小伙伴可以參考一下,希望對(duì)你有所幫助
    2022-01-01
  • python 實(shí)現(xiàn)圍棋游戲(純tkinter gui)

    python 實(shí)現(xiàn)圍棋游戲(純tkinter gui)

    這篇文章主要介紹了python 如何實(shí)現(xiàn)圍棋游戲,幫助大家利用tkinter制作圖形界面程序,感興趣的朋友可以了解下
    2020-11-11
  • Python魔術(shù)方法深入分析講解

    Python魔術(shù)方法深入分析講解

    所謂魔法函數(shù)(Magic Methods),是Python的?種?級(jí)語(yǔ)法,允許你在類中?定義函數(shù)(函數(shù)名格式?般為__xx__),并綁定到類的特殊?法中。?如在類A中?定義__str__()函數(shù),則在調(diào)?str(A())時(shí),會(huì)?動(dòng)調(diào)?__str__()函數(shù),并返回相應(yīng)的結(jié)果
    2023-02-02
  • Django自帶的用戶驗(yàn)證系統(tǒng)實(shí)現(xiàn)

    Django自帶的用戶驗(yàn)證系統(tǒng)實(shí)現(xiàn)

    這篇文章主要介紹了Django自帶的用戶驗(yàn)證系統(tǒng)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Python繪制指數(shù)概率分布函數(shù)

    Python繪制指數(shù)概率分布函數(shù)

    指數(shù)分布是一種廣泛應(yīng)用于數(shù)據(jù)科學(xué)和統(tǒng)計(jì)學(xué)中的連續(xù)概率分布,本文將詳細(xì)介紹如何在Python中快速上手繪制指數(shù)分布的概率密度函數(shù)圖,需要的可以參考下
    2025-01-01
  • Python的Scrapy框架基本使用詳解

    Python的Scrapy框架基本使用詳解

    這篇文章主要介紹了Python的Scrapy框架基本使用詳解,Scrapy,Python開發(fā)的一個(gè)快速、高層次的屏幕抓取和web抓取框架,用于抓取web站點(diǎn)并從頁(yè)面中提取結(jié)構(gòu)化的數(shù)據(jù),Scrapy用途廣泛,可以用于數(shù)據(jù)挖掘、監(jiān)測(cè)和自動(dòng)化測(cè)試,需要的朋友可以參考下
    2023-12-12
  • python dict 相同key 合并value的實(shí)例

    python dict 相同key 合并value的實(shí)例

    今天小編就為大家分享一篇python dict 相同key 合并value的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2019-01-01
  • 使用Folium在Python中進(jìn)行地圖可視化的操作指南

    使用Folium在Python中進(jìn)行地圖可視化的操作指南

    在數(shù)據(jù)分析和可視化領(lǐng)域,地圖可視化是一項(xiàng)非常重要的技能,它能夠幫助我們更直觀地理解和展示地理空間數(shù)據(jù),Folium是一個(gè)基于Python的地圖可視化庫(kù),本文將詳細(xì)介紹如何使用Folium在Python中進(jìn)行地圖可視化,需要的朋友可以參考下
    2025-03-03
  • Selenium操作隱藏的元素及問題解決方案

    Selenium操作隱藏的元素及問題解決方案

    這篇文章主要介紹了Selenium操作隱藏的元素及問題解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-12-12
  • python 創(chuàng)建彈出式菜單的實(shí)現(xiàn)代碼

    python 創(chuàng)建彈出式菜單的實(shí)現(xiàn)代碼

    這篇文章主要介紹了python 創(chuàng)建彈出式菜單的實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-07-07

最新評(píng)論