項目場景
- ??辦公文檔管理??:將掃描的發票、合同等文檔按編號、日期自動重命名。例如,識別“編號:2023001 日期:20230403”生成“2023001_20230403.jpg”。
- ??產品圖片整理??:電商產品圖片按產品編號、名稱自動命名。例如,識別“產品編號:P1001 產品名稱:無線耳機”生成“P1001_無線耳機.jpg”。
- ??證件照片歸檔??:身份證、學生證等證件照片按姓名、學號等信息命名。例如,識別“姓名:張三 學號:20230001”生成“張三_20230001.jpg”。
- ??會議資料整理??:會議照片按會議名稱、日期自動命名。例如,識別“會議:季度總結 日期:20230403”生成“季度總結_20230403.jpg”。
界面設計
可以使用Python的tkinter
庫來設計一個簡單的圖形用戶界面(GUI),以下是一個基本的界面設計思路:
- ??標題??:顯示“批量圖片文字識別與重命名工具”。
- ??API配置區域??:包含輸入框用于填寫騰訊云的
SecretId
和SecretKey
,以及一個“保存配置”按鈕。 - ??關鍵字設置區域??:輸入框用于輸入要識別的關鍵詞,用逗號分隔,例如“編號,名稱,日期”,并提供一個“設置關鍵詞”按鈕。
- ??圖片選擇區域??:一個按鈕用于選擇要處理的圖片文件,支持多選,下方顯示已選擇的圖片數量。
- ??選項設置區域??:包含“自動重命名文件”和“添加序號后綴”的復選框。
- ??開始處理按鈕??:點擊后開始進行文字識別和文件重命名操作。
- ??進度條??:顯示處理進度。
- ??結果區域??:顯示識別結果和重命名信息。
詳細代碼步驟
1. 安裝必要的庫
pip install pillow requests tkinter
2. 代碼實現
import os
import requests
from PIL import Image
from tkinter import Tk, Label, Entry, Button, Listbox, Checkbutton, IntVar, filedialog, messagebox, ttk# 騰訊云OCR API地址
OCR_API_URL = "https://ocr.tencentcloudapi.com"# 全局變量存儲API密鑰和關鍵詞
SECRET_ID = ""
SECRET_KEY = ""
KEYWORDS = ""def set_api_config():global SECRET_ID, SECRET_KEYSECRET_ID = secret_id_entry.get()SECRET_KEY = secret_key_entry.get()if SECRET_ID and SECRET_KEY:messagebox.showinfo("提示", "API配置已保存")else:messagebox.showerror("錯誤", "請輸入SecretId和SecretKey")def set_keywords():global KEYWORDSKEYWORDS = keywords_entry.get()if KEYWORDS:messagebox.showinfo("提示", "關鍵詞已設置")else:messagebox.showerror("錯誤", "請輸入要識別的關鍵詞,用逗號分隔")def select_images():global image_pathsimage_paths = filedialog.askopenfilenames(filetypes=[("圖片文件", "*.jpg;*.png")])if image_paths:image_count_label.config(text=f"已選擇 {len(image_paths)} 張圖片")else:messagebox.showerror("錯誤", "未選擇任何圖片")def recognize_and_rename():if not SECRET_ID or not SECRET_KEY or not KEYWORDS:messagebox.showerror("錯誤", "請先完成API配置和關鍵詞設置")returnif not image_paths:messagebox.showerror("錯誤", "請先選擇要處理的圖片")returntotal = len(image_paths)progress["maximum"] = totalprogress["value"] = 0for i, image_path in enumerate(image_paths):try:# 讀取圖片with open(image_path, "rb") as f:image_data = f.read()# 構建請求參數params = {"Action": "GeneralBasicOCR","Version": "2018-11-19","Region": "ap-guangzhou","SecretId": SECRET_ID,"SecretKey": SECRET_KEY,"ImageBase64": image_data.hex()}# 發送請求response = requests.get(OCR_API_URL, params=params)result = response.json()if "TextDetections" in result:text = " ".join([item["DetectedText"] for item in result["TextDetections"]])# 根據關鍵詞提取信息keyword_values = []for keyword in KEYWORDS.split(","):start_index = text.find(keyword)if start_index != -1:end_index = start_index + len(keyword)value = text[end_index:].split()[0](@ref)keyword_values.append(value)else:keyword_values.append("")# 生成新文件名new_name = "_".join(keyword_values) + os.path.splitext(image_path)[1]new_path = os.path.join(os.path.dirname(image_path), new_name)# 重命名文件os.rename(image_path, new_path)result_text.insert(tk.END, f"{image_path} -> {new_path}\n")else:result_text.insert(tk.END, f"{image_path} 識別失敗\n")progress["value"] += 1root.update_idletasks()except Exception as e:result_text.insert(tk.END, f"{image_path} 處理出錯: {str(e)}\n")progress["value"] += 1root.update_idletasks()messagebox.showinfo("完成", "處理完成")# 創建主窗口
root = Tk()
root.title("批量圖片文字識別與重命名工具")# API配置區域
api_frame = LabelFrame(root, text="API配置")
api_frame.pack(pady=10, padx=10, fill="x")Label(api_frame, text="SecretId:").grid(row=0, column=0, padx=5, pady=5)
secret_id_entry = Entry(api_frame)
secret_id_entry.grid(row=0, column=1, padx=5, pady=5)Label(api_frame, text="SecretKey:").grid(row=1, column=0, padx=5, pady=5)
secret_key_entry = Entry(api_frame, show="*")
secret_key_entry.grid(row=1, column=1, padx=5, pady=5)save_api_button = Button(api_frame, text="保存配置", command=set_api_config)
save_api_button.grid(row=2, column=0, columnspan=2, pady=10)# 關鍵字設置區域
keyword_frame = LabelFrame(root, text="關鍵字設置")
keyword_frame.pack(pady=10, padx=10, fill="x")Label(keyword_frame, text="關鍵詞:").grid(row=0, column=0, padx=5, pady=5)
keywords_entry = Entry(keyword_frame)
keywords_entry.grid(row=0, column=1, padx=5, pady=5)set_keyword_button = Button(keyword_frame, text="設置關鍵詞", command=set_keywords)
set_keyword_button.grid(row=1, column=0, columnspan=2, pady=10)# 圖片選擇區域
image_frame = LabelFrame(root, text="圖片選擇")
image_frame.pack(pady=10, padx=10, fill="x")Label(image_frame, text="選擇圖片:").grid(row=0, column=0, padx=5, pady=5)
image_listbox = Listbox(image_frame)
image_listbox.grid(row=0, column=1, padx=5, pady=5)select_button = Button(image_frame, text="選擇圖片", command=select_images)
select_button.grid(row=1, column=0, columnspan=2, pady=10)image_count_label = Label(image_frame, text="未選擇任何圖片")
image_count_label.grid(row=2, column=0, columnspan=2, pady=5)# 選項設置區域
option_frame = LabelFrame(root, text="選項設置")
option_frame.pack(pady=10, padx=10, fill="x")auto_rename_var = IntVar()
auto_rename_checkbox = Checkbutton(option_frame, text="自動重命名文件", variable=auto_rename_var)
auto_rename_checkbox.grid(row=0, column=0, padx=5, pady=5)add_suffix_var = IntVar()
add_suffix_checkbox = Checkbutton(option_frame, text="添加序號后綴", variable=add_suffix_var)
add_suffix_checkbox.grid(row=1, column=0, padx=5, pady=5)# 開始處理按鈕
start_button = Button(root, text="開始處理", command=recognize_and_rename)
start_button.pack(pady=20)# 進度條
progress = ttk.Progressbar(root, orient="horizontal", length=300, mode="determinate")
progress.pack(pady=10)# 結果區域
result_text = Text(root, height=10, width=50)
result_text.pack(pady=10)root.mainloop()