最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

Python 3.6+

Pillow庫 (PIL的fork版本)

安裝Pillow庫:

pip install pillow

核心功能

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

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

可選擇保留原始圖片或僅保留轉換后的圖片

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

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

技術要點

1. Pillow庫基礎

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

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

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

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

遞歸遍歷目錄

文件類型判斷

3. 用戶界面

命令行參數(shù)解析

簡單GUI界面構建(使用tkinter)

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

1. 導入必要的庫

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

知識點:

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

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

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

tkinter: Python標準GUI庫

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

def convert_image(input_path, output_path, format, quality=95, resize=None):
    """
    轉換單個圖片的格式
    
    參數(shù):
    input_path - 輸入圖片路徑
    output_path - 輸出圖片路徑
    format - 目標格式 (如 'JPEG', 'PNG')
    quality - 圖片質(zhì)量 (1-100, 僅對JPEG格式有效)
    resize - 調(diào)整大小的元組 (width, height) 或 None
    
    返回:
    bool - 轉換是否成功
    """
    try:
        # 打開圖片
        img = Image.open(input_path)
        
        # 如果是RGBA模式且轉換為JPEG,需要轉換為RGB模式
        if img.mode == 'RGBA' and format.upper() == 'JPEG':
            img = img.convert('RGB')
        
        # 調(diào)整大小
        if resize:
            img = img.resize(resize, Image.LANCZOS)
        
        # 保存轉換后的圖片
        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"轉換圖片 {input_path} 時出錯: {e}")
        return False

知識點:

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

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

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

異常處理: 捕獲并處理可能的錯誤

3. 批量轉換功能

def batch_convert(input_dir, output_dir, target_format, quality=95, 
                 resize=None, recursive=False, keep_original=True):
    """
    批量轉換指定目錄中的圖片
    
    參數(shù):
    input_dir - 輸入目錄
    output_dir - 輸出目錄
    target_format - 目標格式
    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)建對應的輸出子目錄
        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:
            # 檢查文件擴展名
            ext = os.path.splitext(file)[1].lower()
            if ext not in supported_formats:
                continue
                
            # 構建輸入和輸出路徑
            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)
            
            # 轉換圖片
            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)

知識點:

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

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

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

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

4. 命令行界面

def setup_cli():
    """設置命令行參數(shù)解析器"""
    parser = argparse.ArgumentParser(description='批量轉換圖片格式')
    
    parser.add_argument('input', help='輸入目錄或文件')
    parser.add_argument('output', help='輸出目錄')
    parser.add_argument('format', help='目標格式 (如: jpg, png, bmp)')
    parser.add_argument('-q', '--quality', type=int, default=95, 
                        help='圖片質(zhì)量 (1-100, 默認: 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()

知識點:

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

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

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

5. 圖形用戶界面

class ImageConverterGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("圖片格式批量轉換器")
        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)
        
        # 目標格式
        ttk.Label(main_frame, text="目標格式:").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)
        
        # 轉換按鈕
        ttk.Button(main_frame, text="開始轉換", command=self.start_conversion).grid(column=1, row=7, pady=10)
        
        # 進度條
        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)標簽
        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("錯誤", "請指定輸入和輸出目錄")
            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("錯誤", "調(diào)整大小參數(shù)無效")
                return
        
        # 開始轉換
        self.status_var.set("轉換中...")
        self.root.update()
        
        try:
            success, failed = batch_convert(
                input_dir, output_dir, target_format, quality,
                resize, recursive, keep_original
            )
            
            self.status_var.set(f"轉換完成。成功: {success}, 失敗: {failed}")
            messagebox.showinfo("完成", f"轉換完成\n成功: {success}\n失敗: {failed}")
        except Exception as e:
            self.status_var.set(f"轉換出錯: {str(e)}")
            messagebox.showerror("錯誤", f"轉換過程中出錯:\n{str(e)}")

知識點:

tkinter: Python標準GUI庫

布局管理: 使用grid布局

控件使用: 標簽、輸入框、按鈕、復選框、組合框、進度條等

事件處理: 按鈕點擊事件

文件對話框: 使用filedialog選擇目錄

6. 主函數(shù)

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

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

完整代碼

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

"""
圖片格式批量轉換器
功能: 批量將圖片從一種格式轉換為另一種格式,支持調(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):
    """
    轉換單個圖片的格式

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

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

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

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

        # 保存轉換后的圖片
        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"轉換圖片 {input_path} 時出錯: {e}")
        return False


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

    參數(shù):
    input_dir - 輸入目錄
    output_dir - 輸出目錄
    target_format - 目標格式
    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)建對應的輸出子目錄
        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:
            # 檢查文件擴展名
            ext = os.path.splitext(file)[1].lower()
            if ext not in supported_formats:
                continue

            # 構建輸入和輸出路徑
            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)

            # 轉換圖片
            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ù)解析器"""
    parser = argparse.ArgumentParser(description='批量轉換圖片格式')

    parser.add_argument('input', help='輸入目錄或文件')
    parser.add_argument('output', help='輸出目錄')
    parser.add_argument('format', help='目標格式 (如: jpg, png, bmp)')
    parser.add_argument('-q', '--quality', type=int, default=95,
                        help='圖片質(zhì)量 (1-100, 默認: 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("圖片格式批量轉換器")
        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)

        # 目標格式
        ttk.Label(main_frame, text="目標格式:").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)

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

        # 進度條
        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)標簽
        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("錯誤", "請指定輸入和輸出目錄")
            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("錯誤", "調(diào)整大小參數(shù)無效")
                return

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

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

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


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

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

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

        # 開始轉換
        print(f"開始轉換圖片從 {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"轉換完成。成功: {success}, 失敗: {failed}")
    else:
        # GUI模式
        root = tk.Tk()
        app = ImageConverterGUI(root)
        root.mainloop()


if __name__ == "__main__":
    main()

知識點:

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

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

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

使用方法

命令行方式

# 基本用法
python image_converter.py 輸入目錄 輸出目錄 目標格式

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

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

GUI方式

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

python image_converter.py

然后在圖形界面中:

  • 選擇輸入目錄
  • 選擇輸出目錄
  • 設置目標格式和其他選項
  • 點擊"開始轉換"按鈕

進階知識點

1. 圖像處理基礎

像素: 圖像的基本單位

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

圖像格式特點:

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

2. Pillow高級特性

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

3. 性能優(yōu)化

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

可擴展功能

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

圖片批量裁剪:自動裁剪圖片到指定比例或尺寸

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

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

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

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

相關文章

  • Python基于回溯法子集樹模板解決取物搭配問題實例

    Python基于回溯法子集樹模板解決取物搭配問題實例

    這篇文章主要介紹了Python基于回溯法子集樹模板解決取物搭配問題,簡單描述了搭配問題并結合實例形式分析了Python使用回溯法子集樹模板解決取物搭配問題的具體步驟與相關操作技巧,需要的朋友可以參考下
    2017-09-09
  • pyqt6實現(xiàn)QTimer定時器介紹和使用場景

    pyqt6實現(xiàn)QTimer定時器介紹和使用場景

    PyQt6中的QTimer是一個定時器類,用于在指定的時間間隔內(nèi)執(zhí)行某個操作,本文主要介紹了pyqt6實現(xiàn)QTimer定時器介紹和使用場景,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • Python讀取本地文件并解析網(wǎng)頁元素的方法

    Python讀取本地文件并解析網(wǎng)頁元素的方法

    今天小編就為大家分享一篇Python讀取本地文件并解析網(wǎng)頁元素的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • python廣度優(yōu)先搜索得到兩點間最短路徑

    python廣度優(yōu)先搜索得到兩點間最短路徑

    這篇文章主要為大家詳細介紹了python廣度優(yōu)先搜索得到兩點間最短路徑,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 使用Python手搓一個Windows注冊表清理器

    使用Python手搓一個Windows注冊表清理器

    這篇文章主要為大家詳細介紹了如何使用Python手搓一個Windows注冊表清理器,本文將從開發(fā)到?EXE?打包進行全面講解,希望對大家有所幫助
    2025-12-12
  • Python+Selenium實現(xiàn)瀏覽器的控制操作

    Python+Selenium實現(xiàn)瀏覽器的控制操作

    這篇文章主要為大家詳細介紹了Python+Selenium如何實現(xiàn)常見的瀏覽器控制操作,例如:瀏覽器參數(shù)設置、控制瀏覽器前進/后退等,感興趣的可以了解一下
    2022-09-09
  • 在Python中如何傳遞任意數(shù)量的實參的示例代碼

    在Python中如何傳遞任意數(shù)量的實參的示例代碼

    這篇文章主要介紹了在Python中如何傳遞任意數(shù)量的實參的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • 利用Python實現(xiàn)Excel表格轉換為HTML格式

    利用Python實現(xiàn)Excel表格轉換為HTML格式

    在數(shù)據(jù)驅動的時代,Excel表格作為信息存儲的常用載體,其內(nèi)容如何高效地在Web端展示,成為了許多開發(fā)者和數(shù)據(jù)分析師面臨的挑戰(zhàn),本文將深入探討如何利用Python,實現(xiàn)Excel表格到HTML的批量、自動化轉換,需要的朋友可以參考下
    2025-10-10
  • python實現(xiàn)控制臺輸出彩色字體

    python實現(xiàn)控制臺輸出彩色字體

    這篇文章主要為大家詳細介紹了python實現(xiàn)控制臺輸出彩色字體,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Django框架模板的使用方法示例

    Django框架模板的使用方法示例

    這篇文章主要介紹了Django框架模板的使用方法,結合實例形式分析了Django框架模板的創(chuàng)建與使用相關操作技巧,需要的朋友可以參考下
    2019-05-05

最新評論

米脂县| 定西市| 象山县| 盐城市| 徐水县| 昭通市| 神池县| 包头市| 沈阳市| 闻喜县| 秦皇岛市| 肇州县| 江油市| 海淀区| 且末县| 大方县| 山丹县| 白玉县| 洪湖市| 资兴市| 衡水市| 平顺县| 桑日县| 德昌县| 涞源县| 平凉市| 甘南县| 从化市| 金寨县| 航空| 怀集县| 台江县| 漳平市| 措勤县| 科技| 岳阳县| 辽宁省| 玉屏| 文成县| 万载县| 青河县|