批量處理JPG圖片,裁剪區(qū)域500x500

image.png

image.png

代碼如下:



import tkinter as tk
from tkinter import filedialog
from PIL import Image
import os
# 導(dǎo)入進度條相關(guān)的庫
from tkinter import ttk
import threading
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk
from PIL import Image, ImageTk
import os
import threading

# 用于顯示選擇的文件夾和圖片列表
def show_selected_folder(folder, listbox):
    listbox.delete(0, tk.END)
    files = [filename for filename in os.listdir(folder) if filename.endswith('.jpg') and not filename.endswith('_55.jpg')]
    listbox.insert(tk.END, f"選擇的文件夾: {folder}")
    listbox.insert(tk.END, f"待處理圖片數(shù)量: {len(files)}")
    listbox.insert(tk.END, "待處理圖片列表:")
    for filename in files:
        listbox.insert(tk.END, filename)

# 更新進度和狀態(tài)信息
def update_progress(progress_bar, status_label, total_files, current_file, filename):
    progress = (current_file / total_files) * 100
    progress_bar['value'] = progress
    progress_bar.update()
    status_label.config(text=f"正在處理 {filename} ({current_file}/{total_files})")

# 批量處理圖片
def batch_process_images(progress_bar, status_label, listbox, result_frame):
    folder = filedialog.askdirectory()
    if not folder:
        return
    show_selected_folder(folder, listbox)
    files = [filename for filename in os.listdir(folder) if filename.endswith('.jpg') and not filename.endswith('_55.jpg')]
    total_files = len(files)
    for index, filename in enumerate(files, start=1):
        file_path = os.path.join(folder, filename)
        try:
            with Image.open(file_path) as img:
                width, height = img.size
                crop_width = min(500, width)
                crop_height = min(500, height)
                cropped_img = img.crop((0, 0, crop_width, crop_height))
                new_filename = os.path.splitext(filename)[0] + '_55.jpg'
                new_file_path = os.path.join(folder, new_filename)
                cropped_img.save(new_file_path)
                # 顯示對比圖片
                show_image_comparison(img, cropped_img, result_frame)
            update_progress(progress_bar, status_label, total_files, index, filename)
        except Exception as e:
            print(f"處理 {filename} 時出錯: {e}")
            status_label.config(text=f"處理 {filename} 時出錯: {e}")
    status_label.config(text="所有圖片處理完成!")
    # 詢問是否打開文件夾
    answer = messagebox.askyesno("處理完成", "是否打開處理后的文件夾?")
    if answer:
        os.startfile(folder)

# 顯示裁剪前后的圖片對比
def show_image_comparison(original_img, cropped_img, result_frame):
    original_img = original_img.resize((200, 200))
    cropped_img = cropped_img.resize((200, 200))
    original_photo = ImageTk.PhotoImage(original_img)
    cropped_photo = ImageTk.PhotoImage(cropped_img)
    original_label = tk.Label(result_frame, image=original_photo)
    original_label.image = original_photo
    original_label.pack(side=tk.LEFT)
    cropped_label = tk.Label(result_frame, image=cropped_photo)
    cropped_label.image = cropped_photo
    cropped_label.pack(side=tk.LEFT)

# 啟動處理線程
def start_processing(progress_bar, status_label, listbox, result_frame):
    thread = threading.Thread(target=batch_process_images, args=(progress_bar, status_label, listbox, result_frame))
    thread.start()

def update_progress(progress_bar, total_files, current_file):
    # 計算當前進度
    progress = (current_file / total_files) * 100
    progress_bar['value'] = progress
    progress_bar.update()

def batch_process_images(progress_bar, status_label):
    # 選擇文件夾
    folder = filedialog.askdirectory()
    if not folder:
        return
    # 獲取所有需要處理的文件
    files = [filename for filename in os.listdir(folder) if filename.endswith('.jpg') and not filename.endswith('_55.jpg')]
    total_files = len(files)
    # 遍歷文件夾中的所有文件
    for index, filename in enumerate(files, start=1):
        file_path = os.path.join(folder, filename)
        try:
            # 打開圖片
            with Image.open(file_path) as img:
                width, height = img.size
                # 確定裁剪區(qū)域
                crop_width = min(500, width)
                crop_height = min(500, height)
                # 裁剪圖片
                cropped_img = img.crop((0, 0, crop_width, crop_height))
                # 生成新的文件名
                new_filename = os.path.splitext(filename)[0] + '_55.jpg'
                new_file_path = os.path.join(folder, new_filename)
                # 保存裁剪后的圖片
                cropped_img.save(new_file_path)
            # 更新進度條
            update_progress(progress_bar, total_files, index)
            # 更新狀態(tài)標簽
            status_label.config(text=f"處理 {filename} 完成 ({index}/{total_files})")
        except Exception as e:
            print(f"處理 {filename} 時出錯: {e}")
            status_label.config(text=f"處理 {filename} 時出錯: {e}")
    # 處理完成提示
    status_label.config(text="所有圖片處理完成!")

def start_processing(progress_bar, status_label):
    # 創(chuàng)建線程來執(zhí)行圖片處理任務(wù)
    thread = threading.Thread(target=batch_process_images, args=(progress_bar, status_label))
    thread.start()

# 創(chuàng)建主窗口
root = tk.Tk()
root.title("批量處理JPG圖片")
# 增大窗口尺寸
root.geometry("600x200")

# 創(chuàng)建按鈕
button = tk.Button(root, text="選擇文件夾", command=lambda: start_processing(progress_bar, status_label))
button.pack(pady=20)

# 創(chuàng)建進度條
progress_bar = ttk.Progressbar(root, orient="horizontal", length=500, mode="determinate")
progress_bar.pack(pady=10)

# 創(chuàng)建狀態(tài)標簽
status_label = tk.Label(root, text="等待選擇文件夾...")
status_label.pack(pady=10)

# 運行主循環(huán)
root.mainloop()

def batch_process_images():
    # 選擇文件夾
    folder = filedialog.askdirectory()
    if not folder:
        return
    # 遍歷文件夾中的所有文件
    for filename in os.listdir(folder):
        if filename.endswith('.jpg') and not filename.endswith('_55.jpg'):
            file_path = os.path.join(folder, filename)
            try:
                # 打開圖片
                with Image.open(file_path) as img:
                    width, height = img.size
                    # 確定裁剪區(qū)域
                    crop_width = min(500, width)
                    crop_height = min(500, height)
                    # 裁剪圖片
                    cropped_img = img.crop((0, 0, crop_width, crop_height))
                    # 生成新的文件名
                    new_filename = os.path.splitext(filename)[0] + '_55.jpg'
                    new_file_path = os.path.join(folder, new_filename)
                    # 保存裁剪后的圖片
                    cropped_img.save(new_file_path)
            except Exception as e:
                print(f"處理 {filename} 時出錯: {e}")

# 創(chuàng)建主窗口
root = tk.Tk()
root.title("批量處理JPG圖片")

# 創(chuàng)建按鈕
button = tk.Button(root, text="選擇文件夾", command=batch_process_images)
button.pack(pady=20)

# 運行主循環(huán)
root.mainloop()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容