本文目录导读:

由于我是一个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 的代码包。
标签: 星级评价
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播