+
24
-

回答

800_auto

代码

import tkinter as tk
from tkinter import filedialog
from PIL import Image
import os


def resize_and_fill_image(input_path, output_path, target_width, target_height):
    # 打开原始图片
    image = Image.open(input_path)
    width, height = image.size

    # 计算新的尺寸,保持图片的宽高比
    ratio = min(target_width / width, target_height / height)
    new_width = int(width * ratio)
    new_height = int(height * ratio)

    # 调整图片大小
    resized_image = image.resize((new_width, new_height), Image.LANCZOS)

    # 创建一个新的空白图片,使用白色填充
    result_image = Image.new("RGB", (target_width, target_height), (255, 255, 255))

    # 计算粘贴的位置,使图片居中
    x_offset = (target_width - new_width) // 2
    y_offset = (target_height - new_height) // 2

    # 将调整后的图片粘贴到新的空白图片上
    result_image.paste(resized_image, (x_offset, y_offset))

    # 保存处理后的图片
    result_image.save(output_path)


def batch_process_images(input_folder, output_folder, target_width, target_height):
    # 确保输出文件夹存在
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 遍历输入文件夹中的所有图片文件
    for filename in os.listdir(input_folder):
        if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
            input_path = os.path.join(input_folder, filename)
            output_path = os.path.join(output_folder, filename)
            resize_and_fill_image(input_path, output_path, target_width, target_height)


def select_source_folder():
    folder = filedialog.askdirectory()
    if folder:
        source_folder_entry.delete(0, tk.END)
        source_folder_entry.insert(0, folder)


def select_target_folder():
    folder = filedialog.askdirectory()
    if folder:
        target_folder_entry.delete(0, tk.END)
        target_folder_entry.insert(0, folder)


def start_processing():
    source_folder = source_folder_entry.get()
    target_folder = target_folder_entry.get()
    try:
        target_width = int(width_entry.get())
        target_height = int(height_entry.get())
        if source_folder and target_folder:
            batch_process_images(source_folder, target_folder, target_width, target_height)
            status_label.config(text="处理完成!")
        else:
            status_label.config(text="请选择源文件夹和目标文件夹。")
    except ValueError:
        status_label.config(text="请输入有效的宽度和高度值。")


# 创建主窗口
root = tk.Tk()
root.title("图片批量裁剪工具")

# 源文件夹选择
source_folder_label = tk.Label(root, text="源文件夹:")
source_folder_label.pack()
source_folder_entry = tk.Entry(root, width=50)
source_folder_entry.pack()
source_folder_button = tk.Button(root, text="选择源文件夹", command=select_source_folder)
source_folder_button.pack()

# 目标文件夹选择
target_folder_label = tk.Label(root, text="目标文件夹:")
target_folder_label.pack()
target_folder_entry = tk.Entry(root, width=50)
target_folder_entry.pack()
target_folder_button = tk.Button(root, text="选择目标文件夹", command=select_target_folder)
target_folder_button.pack()

# 目标宽度和高度输入
width_label = tk.Label(root, text="目标宽度:")
width_label.pack()
width_entry = tk.Entry(root, width=10)
width_entry.insert(0, "800")
width_entry.pack()

height_label = tk.Label(root, text="目标高度:")
height_label.pack()
height_entry = tk.Entry(root, width=10)
height_entry.insert(0, "600")
height_entry.pack()

# 开始处理按钮
process_button = tk.Button(root, text="开始处理", command=start_processing)
process_button.pack()

# 状态显示
status_label = tk.Label(root, text="")
status_label.pack()

# 运行主循环
root.mainloop()

网友回复

我知道答案,我要回答