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()