在日常工作和生活中,我们常常会遇到需要处理大量图片文字的情况。像我,作为一名博主,经常需要整理各种资料,其中不少都是图片形式,里面的文字要是靠手动录入,那可太费时间和精力了。
一开始,我尝试使用市面上已有的图片文字识别工具,可它们或多或少都存在一些问题:
而且,这些通用工具往往不能完全满足我的个性化需求。
我想要一个能快速批量识别图片文字,并且可以直接将识别结果导出为 txt 文本,方便我后续编辑整理的工具
既然找不到完全符合自己需求的工具,那不如自己动手,丰衣足食!于是,我决定利用 tkinter 和百度 api 来开发一款专属的图片文字识别工具。
这款工具的核心 “大脑” 就是百度文字识别 API,它基于先进的深度学习算法 ,就像一个知识渊博的学者,能够快速准确地识别出图片中的文字。
其优势十分显著:
要使用百度文字识别 API,首先得申请并获取 API 密钥。具体步骤如下:
Tkinter 在工具开发中扮演着 “交互桥梁” 的重要角色,它是 Python 的标准 GUI 库,让我能轻松创建出图形界面,把复杂的代码操作转化为直观的图形交互。
利用 Tkinter,我创建了各种图形界面元素。比如按钮,用户点击 “选择图片” 按钮,就能从本地文件中选择需要识别的图片;点击 “开始识别” 按钮,工具就会调用百度 API 进行文字识别;点击 “导出结果” 按钮,识别结果就能以 txt 文本的形式保存到本地。还有文本框,用于显示识别结果,方便用户查看和编辑。通过 Tkinter,这些界面元素被有序地组合在一起,形成了一个操作便捷、界面友好的工具 ,让即使不太懂技术的用户也能轻松上手。
在开始开发前,我们需要准备好相应的开发环境。
在安装这些库的过程中,可能会遇到网络问题导致安装失败,此时可以尝试更换 pip 源,比如使用清华大学的镜像源,在安装命令中加上-i https://pypi.tuna.tsinghua.edu.cn/simple参数,就能提高安装成功率。
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
使用tkinter创建图形界面,以下是创建窗口、按钮、文件选择框等界面元素的核心代码:
import tkinter as tk
from tkinter import filedialog, scrolledtext
import requests
import base64
# 百度API配置(需要用户自己申请)
# 申请地址:https://console.bce.baidu.com/ai/#/ai/ocr/app/create
API_KEY = ''
SECRET_KEY = ''
OCR_URL = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic"
class OCRApp:
def __init__(self, master):
"""OCR应用主界面初始化
Args:
master: Tkinter根窗口对象
"""
# 新增文件路径列表属性
self.file_list_paths = [] # 存储用户选择的完整文件路径
self.master = master
master.title("OCR文字识别工具")
# 顶部工具栏
btn_frame = tk.Frame(master)
btn_frame.pack(pady=10, padx=10, fill=tk.X)
# 功能按钮:选择文件/开始识别/导出结果
tk.Button(btn_frame, text="选择文件", command=self.select_image).pack(side=tk.LEFT, padx=5)
tk.Button(btn_frame, text="开始识别", command=self.recognize_text).pack(side=tk.LEFT, padx=5)
tk.Button(btn_frame, text="导出结果", command=self.export_text).pack(side=tk.LEFT, padx=5)
# 主布局(左右分割视图)
main_paned = tk.PanedWindow(master, orient=tk.HORIZONTAL)
main_paned.pack(fill=tk.BOTH, expand=True)
# 左侧文件列表区域
left_frame = tk.Frame(main_paned)
self.file_listbox = tk.Listbox(left_frame, width=40) # 显示文件名列表
scroll_left = tk.Scrollbar(left_frame, orient=tk.VERTICAL)
# 滚动条与列表框绑定
self.file_listbox.config(yscrollcommand=scroll_left.set)
scroll_left.config(command=self.file_listbox.yview)
# 右侧识别结果区域
right_frame = tk.Frame(main_paned)
self.result_text = scrolledtext.ScrolledText(right_frame, width=70, wrap=tk.WORD) # 带滚动条的文本区域
# 布局组件
self.file_listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
scroll_left.pack(side=tk.RIGHT, fill=tk.Y)
self.result_text.pack(fill=tk.BOTH, expand=True)
# 将左右面板添加到主分割窗口
main_paned.add(left_frame)
main_paned.add(right_frame)
在这段代码中,用tkinter构建界面,select_image函数用于打开文件选择对话框,让用户选择图片文件,并将选择的文件路径显示在文本框中。recognize_text函数负责获取文本框中的文件路径,然后调用识别函数对图片进行文字识别,这里的识别函数还未实现,后续会详细介绍。export_text函数用于将识别结果导出为 txt 文本。
tk.Button用于创建按钮,tk.Text用于创建文本框,pack方法用于布局这些界面元素 。
调用百度 API 进行文字识别的代码如下:
def get_access_token(self):
"""获取百度API访问令牌"""
auth_url = f"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={API_KEY}&client_secret={SECRET_KEY}"
response = requests.get(auth_url)
return response.json().get("access_token")
def recognize_text(self):
"""执行OCR识别主逻辑"""
if not hasattr(self, 'file_list_paths'):
return
self.result_text.delete(1.0, tk.END)
for i, path in enumerate(self.file_list_paths):
try:
access_token = self.get_access_token()
if not access_token:
raise Exception("认证失败,请检查API配置")
# 读取图片并编码
with open(path, "rb") as f:
image_data = base64.b64encode(f.read()).decode()
# 调用OCR接口
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
payload = {
'access_token': access_token,
'image': image_data,
'language_type': 'CHN_ENG'
}
response = requests.post(OCR_URL, headers=headers, data=payload)
result = response.json()
# 显示结果
if 'words_result' in result:
texts = [item['words'] for item in result['words_result']]
# 添加结果分隔标识
self.result_text.insert(tk.END, f"\n▶ 文件:{self.file_listbox.get(i)}\n")
self.result_text.insert(tk.END, '\n'.join(texts) + '\n')
except Exception as e:
self.result_text.insert(tk.END, f"\n▶ 文件:{self.file_listbox.get(i)} 识别失败\n{str(e)}\n")
在这段代码中,get_access_token方法,将传入的API_KEY和SECRET_KEY获取得到access_token。recognize_text函数用于读取获取到的图片文件,并调用百度 API 的OCR_URL进行文字识别。如果识别成功,从返回结果中提取文字,并以换行符连接成字符串返回;如果识别失败或没有识别到文字,返回识别失败 。
为了提高识别效率,可以考虑使用多线程或异步编程,比如使用concurrent.futures模块中的ThreadPoolExecutor来创建线程池,并行处理图片识别任务,这样可以大大缩短批量识别的时间 。
将识别结果导出为 txt 文本的代码如下:
def export_text(self):
"""导出识别结果到txt文件"""
content = self.result_text.get("1.0", tk.END).strip()
if not content:
return
file_path = filedialog.asksaveasfilename(
defaultextension=".txt",
filetypes=[("Text files", "*.txt"), ("All files", "*.*")]
)
if file_path:
try:
with open(file_path, "w", encoding="utf-8") as f:
f.write(content)
except Exception as e:
self.result_text.delete(1.0, tk.END)
self.result_text.insert(tk.END, f"导出失败:{str(e)}")
在export_text函数中,首先获取所有图片的识别结果,然后使用open函数以写入模式打开file_path文件夹。遍历识别结果列表,将每个图片的识别结果写入文件中,并在每个结果前加上图片名称,以区分不同图片的识别内容 。
说了这么多,这个工具实际用起来到底怎么样呢?下面就带大家一起来实测一下 。当我打开这个工具时,映入眼帘的是简洁直观的界面,各个按钮和文本框布局合理,让人一目了然。
点击 “选择文件” 按钮,我一次性选择了 3 张图片。
接着,点击 “开始识别” 按钮,工具迅速响应,调用百度 API 对图片进行识别。短短几秒,所有图片的文字就识别完成了,速度非常快。在识别结果文本框中,清晰地展示了每张图片识别出的文字,准确率相当高。
识别完成后,点击 “导出结果” 按钮,识别结果就会以 txt 文本的形式保存到本地。打开生成的 txt 文件,里面按照图片顺序,清晰地展示了每张图片的识别结果,方便我进行整理和编辑 。
链接: https://pan.baidu.com/s/1l5rOsZMLRrt8WgoKWxcdeA?pwd=87vh 提取码: 87vh
这款用 tkinter 开发、结合百度 api 的图片文字识别工具,操作简单、功能强大,能够高效地解决图片文字识别和批量处理的问题,为大家节省大量时间和精力。
而且,通过自己开发工具,我们能更深入地了解技术原理,还能根据实际需求不断优化和扩展功能。如果你对编程感兴趣,不妨参考本文的思路和代码,自己动手开发一个,说不定还能发现更多有趣的玩法和应用场景 。
我也非常期待大家能在留言区分享使用这款工具的体验和想法,比如在使用过程中遇到了哪些问题,有没有什么改进建议,或者你还希望增加哪些功能。让我们一起交流探讨,共同把这个工具变得更加完善 。