本文目录导读:

由于我是一个AI文本模型,无法直接运行图形界面软件,但我可以提供 完整的代码逻辑(Python + Tkinter/Flask) 以及 操作流程设计,您可以根据需要选择实现方式。
本地桌面应用(Python + Tkinter / PyQt)
适合需要离线、快速、处理大量本地图片的用户。
核心功能设计
- 加载目录:选择文件夹,自动扫描所有图片(jpg, png, raw等)。
- 展示模式:
- 单张展示:大图预览,适合精细评级。
- 缩略图网格:多图同时显示,适合快速批量打分。
- 星级操作:
- 鼠标点击星标(1-5星)。
- 键盘快捷键(如
1、2、3、4、5键快速打分,0或Space清除评分)。
- 数据存储:推荐以下两种方式:
- 方式A(无损):将评分写入图片文件的 XMP元数据(
xmp:Rating字段),不影响画质,兼容Lightroom等专业软件。 - 方式B(简单):在图片同目录下生成一个
ratings.csv文件,记录文件名,星级。
- 方式A(无损):将评分写入图片文件的 XMP元数据(
- 筛选过滤:
- 按星级筛选(如只显示4星以上的图)。
- 按未评分筛选。
Python 核心代码示例(Tkinter + Pillow + piexif)
import os
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk
import piexif # 用于读写图片元数据
class ImageRatingApp:
def __init__(self, root):
self.root = root
self.root.title("图片批量星级评价工具")
self.image_paths = []
self.current_index = 0
self.rating = 0
# UI 布局
self.label = tk.Label(root, text="请选择一个图片文件夹")
self.label.pack()
self.canvas = tk.Canvas(root, width=800, height=600, bg='gray')
self.canvas.pack()
self.star_frame = tk.Frame(root)
self.star_frame.pack()
self.star_buttons = []
for i in range(1, 6):
btn = tk.Button(self.star_frame, text=f"{i}★", command=lambda i=i: self.set_rating(i))
btn.pack(side=tk.LEFT, padx=5)
self.star_buttons.append(btn)
self.nav_frame = tk.Frame(root)
self.nav_frame.pack()
tk.Button(self.nav_frame, text="上一张 (←)", command=self.prev_image).pack(side=tk.LEFT)
tk.Button(self.nav_frame, text="下一张 (→)", command=self.next_image).pack(side=tk.LEFT)
tk.Button(root, text="打开文件夹", command=self.load_folder).pack()
# 键盘绑定
root.bind('<Left>', lambda e: self.prev_image())
root.bind('<Right>', lambda e: self.next_image())
for i in range(1, 6):
root.bind(str(i), lambda e, i=i: self.set_rating(i))
def load_folder(self):
folder = filedialog.askdirectory()
if folder:
self.image_paths = [os.path.join(folder, f) for f in os.listdir(folder)
if f.lower().endswith(('png','jpg','jpeg','bmp','tiff'))]
self.current_index = 0
self.show_image()
def show_image(self):
if not self.image_paths: return
path = self.image_paths[self.current_index]
img = Image.open(path)
img.thumbnail((800, 600))
self.tk_img = ImageTk.PhotoImage(img)
self.canvas.config(width=self.tk_img.width(), height=self.tk_img.height())
self.canvas.create_image(0, 0, anchor=tk.NW, image=self.tk_img)
self.label.config(text=f"{self.current_index+1}/{len(self.image_paths)} - {os.path.basename(path)}")
self.load_rating_from_exif(path)
def set_rating(self, rating):
self.rating = rating
path = self.image_paths[self.current_index]
# 写入 XMP 元数据(简化版,实际可用 piexif 或 pyxmp)
try:
exif_dict = piexif.load(path)
# piexif 通过 UserComment 模拟,或直接写 XMP(需额外库)
# 这里用文件名简单示例
print(f"评分 {rating} -> {path}")
# 实际写入将使用: save_rating_to_exif(path, rating)
except:
pass
# 更新UI星标显示
self.update_star_display()
def prev_image(self):
if self.current_index > 0:
self.current_index -= 1
self.show_image()
def next_image(self):
if self.current_index < len(self.image_paths)-1:
self.current_index += 1
self.show_image()
def update_star_display(self):
for i, btn in enumerate(self.star_buttons):
if i < self.rating:
btn.config(bg='gold')
else:
btn.config(bg='SystemButtonFace')
Web 版(Flask + HTML + JavaScript)
适合团队协作、跨平台、无需安装软件的场景。
快速搭建步骤
- 后端(Python Flask):
- 提供 API:
/images返回图片列表。 - 提供 API:
/rate接收{"filename": "xxx.jpg", "rating": 4}。 - 存储到 SQLite 或 JSON 文件。
- 提供 API:
- 前端(HTML + JS):
- 使用星级评分组件(如 Font Awesome 或纯 CSS 星星)。
- 左右箭头切换图片。
- AJAX 异步提交评分。
轻量级脚本工具
如果你只需要一次性的快速评分,不依赖 GUI,可以使用命令行脚本:
# 命令行工具:通过终端快速为图片打分 python batch_rating.py --folder "D:\图片" --star 4 --output rating.csv
建议与注意事项
- 处理大量图片(>10000张):建议使用 缩略图模式 或 SQLite 数据库存储评分,避免每次启动扫描目录。
- 元数据标准:
- 如果目标是与 Adobe Lightroom、Capture One 兼容,请使用 XMP 的
Rating字段。 - 如果只是简单管理,使用 文件名重命名(如
IMG_001_5star.jpg)或 同级 CSV。
- 如果目标是与 Adobe Lightroom、Capture One 兼容,请使用 XMP 的
- 进阶功能:
- 颜色标签:增加红黄绿蓝标签(对应 Lightroom 的颜色标签)。
- 增加文本标签输入框。
- 双图对比:左右两张图并排,方便选片。
如果您需要我生成 完整的、可直接运行的代码(Python 桌面版或 Web 版),请告诉我您的偏好(Windows/Mac/Linux、本地或Web、使用场景),我可以为您整理一份可直接 Copy 的代码包。
标签: 星级评价
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。