批量处理JPG图片,裁剪区域500x500

image.png

image.png

代码如下:



import tkinter as tk
from tkinter import filedialog
from PIL import Image
import os
# 导入进度条相关的库
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"待处理图片数量: {len(files)}")
    listbox.insert(tk.END, "待处理图片列表:")
    for filename in files:
        listbox.insert(tk.END, filename)

# 更新进度和状态信息
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
                # 确定裁剪区域
                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)
            # 更新状态标签
            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):
    # 创建线程来执行图片处理任务
    thread = threading.Thread(target=batch_process_images, args=(progress_bar, status_label))
    thread.start()

# 创建主窗口
root = tk.Tk()
root.title("批量处理JPG图片")
# 增大窗口尺寸
root.geometry("600x200")

# 创建按钮
button = tk.Button(root, text="选择文件夹", command=lambda: start_processing(progress_bar, status_label))
button.pack(pady=20)

# 创建进度条
progress_bar = ttk.Progressbar(root, orient="horizontal", length=500, mode="determinate")
progress_bar.pack(pady=10)

# 创建状态标签
status_label = tk.Label(root, text="等待选择文件夹...")
status_label.pack(pady=10)

# 运行主循环
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
                    # 确定裁剪区域
                    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}")

# 创建主窗口
root = tk.Tk()
root.title("批量处理JPG图片")

# 创建按钮
button = tk.Button(root, text="选择文件夹", command=batch_process_images)
button.pack(pady=20)

# 运行主循环
root.mainloop()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容