吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 636|回复: 12
上一主题 下一主题
收起左侧

[Python 原创] 框图 快速在图片中标注图片文件名

[复制链接]
跳转到指定楼层
楼主
as22070 发表于 2024-12-3 10:40 回帖奖励
有时候整理档案时,需要把图片存档,而且图片上最好标注好文件名,效果是这样的



软件界面


完整代码如下
[Python] 纯文本查看 复制代码
import os
from tkinter import Tk, filedialog, messagebox, scrolledtext
from tkinter.ttk import Frame, Label, Entry, Button
from PIL import Image, ImageDraw, ImageFont
import tkinter as tk

class SettingsApp:
    def __init__(self, master):
        self.master = master
        master.title("框图_快速在图片中标注图片文件名")

        self.border_height_var = tk.DoubleVar(value=0.05)
        self.font_size_var = tk.DoubleVar(value=0.04)
        self.prefix_var = tk.StringVar(value="标注_")
        
        # 初始化路径变量
        self.image_paths = []  # 用于存储选中的多个图片路径
        self.output_folder = ""  # 存储输出文件夹路径
        
        self.create_widgets()

    def create_widgets(self):
        frame = Frame(self.master, padding="20")
        frame.grid(row=0, column=0, sticky="NSEW")

        Label(frame, text="底框大小 %:").grid(row=0, column=0)
        Entry(frame, textvariable=self.border_height_var).grid(row=0, column=1)

        Label(frame, text="字体大小 %:").grid(row=1, column=0)
        Entry(frame, textvariable=self.font_size_var).grid(row=1, column=1)

        Label(frame, text="新文件前缀:").grid(row=2, column=0)
        Entry(frame, textvariable=self.prefix_var).grid(row=2, column=1)

        Button(frame, text="选择图片", command=self.select_images).grid(row=3, column=0)
        Button(frame, text="选择保存的文件夹", command=self.choose_output_folder).grid(row=3, column=1)
        
        # 使用ScrolledText widget显示多选的文件路径
        self.image_paths_display = scrolledtext.ScrolledText(frame, height=5, wrap=tk.WORD)
        self.image_paths_display.grid(row=4, column=0, columnspan=2, sticky="WE")
        self.image_paths_display.configure(state='disabled')

        Button(frame, text="开始处理图片", command=self.process_images).grid(row=6, column=0, columnspan=2)

        for child in frame.winfo_children():
            child.grid_configure(padx=5, pady=5)

    def select_images(self):
        file_paths = filedialog.askopenfilenames(title="选择需处理的图片", filetypes=[("Image Files", "*.jpg *.jpeg *.png *.gif")])
        if file_paths:
            self.image_paths.extend(file_paths)
            paths_str = "\n".join(self.image_paths)
            self.image_paths_display.configure(state='normal')
            self.image_paths_display.delete(1.0, tk.END)
            self.image_paths_display.insert(tk.END, paths_str)
            self.image_paths_display.configure(state='disabled')

    def choose_output_folder(self):
        self.output_folder = filedialog.askdirectory()


    def process_images(self):
        if not self.image_paths or not self.output_folder:
            messagebox.showerror("错误", "请选择图片保存的文件夹.")
            return

        border_percent = self.border_height_var.get()
        font_size = self.font_size_var.get()
        prefix = self.prefix_var.get()

        success_count = 0
        error_files = []

        for image_path in self.image_paths:
            try:
                filename = os.path.basename(image_path)
                output_path = os.path.join(self.output_folder, f"{prefix}{filename}")
                add_border_and_text(image_path, output_path, border_percent, font_size, prefix)
                success_count += 1
            except Exception as e:
                error_files.append((filename, str(e)))

        if success_count > 0:
            if len(error_files) == 0:
                messagebox.showinfo("成功", f"所有图片已成功处理并保存至: {self.output_folder}")
            else:
                error_message = "\n".join([f"文件: {file}, 错误: {error}" for file, error in error_files])
                messagebox.showinfo("完成但有错误", f"成功处理了 {success_count} 张图片并保存至: {self.output_folder}\n\n处理中遇到以下错误:\n{error_message}")
        else:
            if error_files:
                error_message = "\n".join([f"文件: {file}, 错误: {error}" for file, error in error_files])
                messagebox.showerror("处理失败", f"图片处理失败,请重试。\n错误详情:\n{error_message}")
            else:
                messagebox.showerror("处理失败", "未处理任何图片,请检查设置并重试。")  

def add_border_and_text(image_path, output_path, border_percent, font_size, prefix):
    img = Image.open(image_path)
    width, height = img.size
    border_height = int(height * border_percent)
    new_height = height + border_height
    new_image = Image.new('RGB', (width, new_height), 'white')
    new_image.paste(img, (0, 0))

    font_path = r"C:\Windows\Fonts\simsun.ttc"  # 确保该字体存在或替换为其他字体路径
    font = ImageFont.truetype(font_path, int(height * font_size))
    filename = os.path.splitext(os.path.basename(image_path))[0]

    text_width, text_height = ImageDraw.Draw(new_image).textsize(filename, font=font)
    text_position = ((width - text_width) // 2, height + (border_height - text_height) // 2)

    draw = ImageDraw.Draw(new_image)
    draw.text(text_position, f"{filename}", fill='black', font=font)  

    new_image.save(output_path)

if __name__ == "__main__":
    root = Tk()
    app = SettingsApp(root)
    root.mainloop()

免费评分

参与人数 2吾爱币 +8 热心值 +2 收起 理由
wushaominkk + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
一丝风 + 1 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
kangta520 发表于 2024-12-3 19:11
谢谢楼主分享  学习了  并且拿来简化了:处理后直接覆盖原文件不必要再创建新前缀文件,还有其他小改动
推荐
helian147 发表于 2024-12-3 14:52
textsize函数已被替代了:

[Python] 纯文本查看 复制代码
def add_border_and_text(image_path, output_path, border_percent, font_size, prefix):
    img = Image.open(image_path)
    width, height = img.size
    border_height = int(height * border_percent)
    new_height = height + border_height
    new_image = Image.new('RGB', (width, new_height), 'white')
    new_image.paste(img, (0, 0))
 
    font_path = r"C:\Windows\Fonts\simsun.ttc"  # 确保该字体存在或替换为其他字体路径
    font = ImageFont.truetype(font_path, int(height * font_size))
    filename = os.path.splitext(os.path.basename(image_path))[0]
 
    text_bbox = ImageDraw.Draw(new_image).textbbox((0,0), filename, font=font)
    text_width, text_height = text_bbox[2] - text_bbox[0], text_bbox[3] - text_bbox[1]
    text_position = ((width - text_width) // 2, height + (border_height - text_height) // 2)
 
    draw = ImageDraw.Draw(new_image)
    draw.text(text_position, f"{filename}", fill='black', font=font)  
 
    new_image.save(output_path)
沙发
一丝风 发表于 2024-12-3 11:10
3#
一丝风 发表于 2024-12-3 11:11
没有打包好的吗?
4#
WWsrg7790 发表于 2024-12-3 11:12
存支持!!!
5#
 楼主| as22070 发表于 2024-12-3 11:13 |楼主
一丝风 发表于 2024-12-3 11:11
没有打包好的吗?

复制到vsc里,自己打包一下就行
6#
tnancy2kk 发表于 2024-12-3 11:15
感谢,这个感觉有用啊,辛苦了,感谢
7#
 楼主| as22070 发表于 2024-12-3 11:15 |楼主
一丝风 发表于 2024-12-3 11:11
没有打包好的吗?

打包完有10多兆,论坛传不上来
8#
sukingmoo 发表于 2024-12-3 11:19
as22070 发表于 2024-12-3 11:15
打包完有10多兆,论坛传不上来

可以上传到网盘                              
9#
happyplay 发表于 2024-12-3 12:43
感谢分享!能够更好的整理文件。
10#
wsasecy 发表于 2024-12-3 13:30
效果在哪里?没看到呀。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-7 17:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表