当前位置: 首页 > news >正文

OCR图片识别翻译工具功能及源码

一、软件名称

OCR图片识别翻译工具

二、软件简介:

本软件主要解决用户在阅读外文图片、截图或界面文字时遇到的语言障碍痛点。通过智能OCR文字识别和精准翻译技术,实现一键截图翻译,大幅提升跨语言阅读效率,让语言不再成为信息获取的障碍。
 

三、软件功能

本软件是一款基于AI技术的智能OCR识别翻译工具,主要功能包括:
1. 智能区域截图:支持自定义框选截图区域,精准捕获需要翻译的内容
2. AI文字识别:采用先进的AI OCR技术,准确提取图片中的文字信息
3. 智能翻译引擎:集成小牛翻译API,支持英汉互译
4. 自动语言检测:智能识别原文语种,自动选择翻译方向
5. 结果展示窗口:提供独立的悬浮窗口显示识别和翻译结果
6. 文本复制功能:支持一键复制原文和译文到剪贴板
7. 字体缩放:提供文本放大显示功能,便于阅读长文本内容

四、使用方法和操作步骤:


1. 运行程序后,桌面会出现一个悬浮翻译窗口
2. 按下快捷键 Ctrl+Alt+A 激活截图功能,或者点界面上的截图键开始截图
3. 用鼠标框选需要识别翻译的屏幕区域
4. 程序自动识别区域内的文字并显示"识别中..."提示
5. 识别完成后自动进行翻译并显示"翻译中..."提示
6. 在悬浮窗口中同时显示原文和译文结果
7. 可点击"复制"按钮将内容复制到剪贴板

五、运行环境

系统要求:Windows操作系统
Python环境:需要安装相关依赖库(PIL、tkinter、keyboard、mss等)
运行方式:直接运行Python脚本

六、技术特点说明


1. OCR识别技术:
   - 主方案:基于智谱AI的GLM-4V视觉模型,准确率高
   - 备用方案:集成Tesseract OCR引擎,确保服务稳定性
   - 精准提取:严格保持原文内容,不增删改写

2. 翻译服务:
   - 翻译引擎:小牛翻译API,专业翻译服务
   - 语言支持:支持中英文互译,可扩展其他语言
   - 自动检测:智能判断原文语种,自动选择翻译方向

3. 截图技术:
   - 使用mss库进行高效屏幕捕获
   - 支持高DPI屏幕显示
   - 区域选择精准,操作流畅

七、特色亮点

操作便捷:快捷键一键触发,简单易用
识别准确:AI OCR技术,文字识别精度高
翻译专业:专业翻译引擎,译文质量可靠
实时显示:独立悬浮窗口,结果展示清晰
双重保障:主备OCR方案,确保服务稳定
界面美观:深色主题设计,视觉效果舒适
代码开源:可自定义修改,满足个性化需求

八、注意事项


1. 使用前请确保网络连接正常,OCR和翻译服务需要联网
2. 首次使用可能需要配置相关API密钥
3. 截图时请确保目标区域文字清晰可见
4. 对于特殊字体或复杂背景的图片,识别准确率可能受影响
5. 本工具仅适用于一般图片翻译,专业领域翻译建议人工校对

九、界面展示

十、源码展示

import os
import tkinter as tk
from urllib import parse, request
import json
import keyboard  # 监听快捷键
import base64
from io import BytesIO
from zai import ZhipuAiClient  # 取消注释
import ctypes
import mss
import mss.tools
from PIL import Image# ================== 小牛翻译 ==================
apikey = "d99fc0600b16efa6e310f53579593c57"def niutrans_translate(sentence, src_lan="auto", tgt_lan="zh"):try:url = 'http://api.niutrans.com/NiuTransServer/translation?'data = {"from": src_lan, "to": tgt_lan, "apikey": apikey, "src_text": sentence}data_en = parse.urlencode(data)req = url + "&" + data_enres = request.urlopen(req, timeout=5)res_dict = json.loads(res.read())if "tgt_text" in res_dict:return res_dict['tgt_text']else:return f"翻译失败: {res_dict}"except Exception as e:return f"翻译接口错误: {str(e)}"# ================== 框选截图区域 ==================
def select_area():# 预初始化Tkinter,避免第一次创建窗口时的跳动root = tk.Tk()root.withdraw()  # 隐藏预初始化窗口root.update_idletasks()# 创建实际的全屏窗口root = tk.Tk()root.attributes("-fullscreen", True)root.attributes("-alpha", 0.3)# 设置窗口位置确保不会影响主界面root.geometry("0x0+0+0")root.update_idletasks()canvas = tk.Canvas(root, cursor="cross")canvas.pack(fill="both", expand=True)rect = Nonestart_x = start_y = 0area = [0, 0, 0, 0]# 设置DPI感知try:ctypes.windll.user32.SetProcessDPIAware()except:passdef on_mouse_down(event):nonlocal start_x, start_y, rectstart_x, start_y = event.x, event.yrect = canvas.create_rectangle(start_x, start_y, start_x, start_y, outline="red", width=3)def on_mouse_move(event):nonlocal rectif rect:canvas.coords(rect, start_x, start_y, event.x, event.y)def on_mouse_up(event):nonlocal areax1, y1, x2, y2 = start_x, start_y, event.x, event.y# 直接使用坐标,不进行缩放转换# MSS会自动处理DPI缩放area = [int(min(x1, x2)), int(min(y1, y2)),int(max(x1, x2)), int(max(y1, y2))]#print(f"Selected area: {area}")root.withdraw()root.quit()canvas.bind("<ButtonPress-1>", on_mouse_down)canvas.bind("<B1-Motion>", on_mouse_move)canvas.bind("<ButtonRelease-1>", on_mouse_up)root.mainloop()root.destroy()return tuple(area)def capture_region(region):"""用 mss 按区域截图,返回 PIL.Image"""with mss.mss() as sct:# 确保区域坐标正确left, top, right, bottom = regionwidth = max(1, right - left)height = max(1, bottom - top)monitor = {"top": top, "left": left,"width": width,"height": height}#print(f"Capturing region: {monitor}")sct_img = sct.grab(monitor)# 保存截图用于调试#mss.tools.to_png(sct_img.rgb, sct_img.size, output="debug_mss_screenshot.png")#print("MSS screenshot saved as debug_mss_screenshot.png")return Image.frombytes("RGB", sct_img.size, sct_img.bgra, "raw", "BGRX")# ================== 主应用 ==================
class TranslationApp:def __init__(self):self.root = tk.Tk()self.root.title("OCR翻译器")self.root.overrideredirect(False)self.root.attributes('-topmost', True)self.root.geometry("400x200")self.font_size = 12self.is_zoomed = Falseself.frame = tk.Frame(self.root, bg='#2C3E50')self.frame.pack(padx=5, pady=5, fill="both", expand=True)self.label = tk.Label(self.frame, text="按 Ctrl+Alt+A 截图翻译",font=('微软雅黑', 12),bg='#2C3E50', fg='#ECF0F1',wraplength=400, justify='left',padx=10, pady=5)self.label.pack(fill="both", expand=True)self.running = Trueself.last_text = ""self.setup_ui()# 注册截图快捷键keyboard.add_hotkey("ctrl+alt+a", self.capture_and_translate)def translate_text(self, text):is_chinese = any('\u4e00' <= c <= '\u9fa5' for c in text)from_lang = "zh" if is_chinese else "en"to_lang = "en" if is_chinese else "zh"return niutrans_translate(text, from_lang, to_lang)def process_image_with_ai(self, pil_image):# 把 PIL 图片转为 base64buffered = BytesIO()pil_image.save(buffered, format="JPEG")encoded_string = base64.b64encode(buffered.getvalue()).decode('utf-8')try:client = ZhipuAiClient(api_key="101fb0dca2d148cc937a73dc61f73368.HfIMCncTJPNibjYl")response = client.chat.completions.create(model="glm-4.1v-thinking-flash",messages=[{"role": "user","content": [{"type": "image_url","image_url": {"url": f"data:image/jpeg;base64,{encoded_string}"}},{"type": "text","text": "请准确提取图片中的文字信息,不增加、删除或改写其它文本内容。"}]}])content = response.choices[0].message.contentif content:content = content.replace("<|begin_of_box|>", "").replace("<|end_of_box|>", "")return contentelse:return "未识别到文字"except Exception as e:print(f"AI OCR错误: {str(e)}")# 如果AI OCR失败,尝试使用Tesseract作为备用方案return self.fallback_ocr(pil_image)def fallback_ocr(self, pil_image):"""备用OCR方案(如果AI OCR失败)"""try:import pytesseract# 如果安装了Tesseracttext = pytesseract.image_to_string(pil_image, lang='chi_sim+eng')return text.strip() if text.strip() else "未识别到文字(备用OCR)"except:return "OCR服务不可用,请检查网络连接或AI密钥"def capture_and_translate(self):try:#print("开始截图...")# 选择截图区域region = select_area()#print(f"选择的区域: {region}")if region[0] == region[2] or region[1] == region[3]:self.update_display("无效的截图区域")return# 使用 mss 截图screenshot = capture_region(region)# 保存截图用于调试#screenshot.save("debug_pil_screenshot.png")#print("PIL screenshot saved as debug_pil_screenshot.png")# 显示"识别中..."提示self.update_display("识别中...")# 调用 AI OCR,直接传 PIL.Imagetext = self.process_image_with_ai(screenshot).strip()#print(f"识别结果: {text}")if text and text != "未识别到文字":self.last_text = text# 显示"翻译中..."提示self.update_display(f"原文: {text}\n翻译中...")# 翻译文本translation = self.translate_text(text)#print(f"翻译结果: {translation}")self.update_display(f"原文: {text}\n\n译文: {translation}")else:self.update_display("未识别到文字")except Exception as e:import tracebackerror_msg = f"错误: {str(e)}\n{traceback.format_exc()}"print(error_msg)self.update_display(f"处理错误:\n{str(e)}")def update_display(self, text):self.label.config(text=text)self.root.update_idletasks()def copy_to_clipboard(self):"""复制原文和译文到剪贴板"""if self.last_text:try:# 获取当前显示的文本current_text = self.label.cget("text")self.root.clipboard_clear()self.root.clipboard_append(current_text)# 临时显示复制成功提示original_text = self.label.cget("text")self.label.config(text="已复制到剪贴板!")self.root.after(1500, lambda: self.label.config(text=original_text))except Exception as e:print(f"复制失败: {e}")def zoom_text(self):"""放大/恢复文本字体"""if not self.is_zoomed:# 放大字体self.font_size = 16self.label.config(font=('微软雅黑', self.font_size, 'bold'))self.is_zoomed = Trueelse:# 恢复原字体self.font_size = 12self.label.config(font=('微软雅黑', self.font_size))self.is_zoomed = Falsedef setup_ui(self):control_frame = tk.Frame(self.frame, bg='#2C3E50')control_frame.pack(fill='x', pady=(5,0))# 左上角放大按钮zoom_btn = tk.Button(control_frame, text="放大",command=self.zoom_text,bg='#27AE60', fg='white', relief='flat', width=6, font=(10))zoom_btn.pack(side='left', padx=2)# 左下角截图按钮capture_btn = tk.Button(control_frame, text="截图",command=self.capture_and_translate,bg='#3498DB', fg='white', relief='flat', width=6, font=(10))capture_btn.pack(side='left', padx=2)exit_btn = tk.Button(control_frame, text="退出",command=self.exit_app,bg='#E74C3C', fg='white', relief='flat', width=6, font=(10))exit_btn.pack(side='right', padx=2)# 右上角复制按钮copy_btn = tk.Button(control_frame, text="复制",command=self.copy_to_clipboard,bg='#9B59B6', fg='white', relief='flat', width=6, font=(10))copy_btn.pack(side='right', padx=2)# 快捷键退出self.root.bind("<Control-Shift-Q>", lambda e: self.exit_app())def exit_app(self):self.running = Falseself.root.destroy()def run(self):self.root.mainloop()if __name__ == "__main__":app = TranslationApp()app.run()

十一、源码软件下载

https://download.csdn.net/download/henanlion/92240519

http://www.dtcms.com/a/566491.html

相关文章:

  • vue3 抽取el-drawer子组件
  • 杭州专业网站建设佛山cms模板建站
  • TCP可靠传输的秘密:从滑动窗口到拥塞控制
  • 宝塔做网站安全吗做网站龙华
  • safetensors转为gguf,并在ollama中部署
  • 做二手车按揭的网站艺术培训机构
  • 如何给网站做右侧导航互联网网络推广公司
  • 公司网站优化推广宁波企业名称查询网站
  • 做淘宝客网站服务器高新网站建设
  • Mysql 读书笔记
  • 网上做任务佣金高的网站wordpress付费浏览
  • Flutter---卡片交换器
  • MAC-SQL 算法一
  • 大连爱得科技网站建设公司怎么样在线设计平台都有哪些比较好用的
  • 【2051】【例3.1】偶数
  • 北京网站开发外包做网站看什么书
  • 怎么做网站推广临沂世界网站
  • C# 使用XML文件保存配方数据
  • 小说网站自主建设网站域名申请
  • 西安谁家的集团门户网站建设比较好上海公司车牌
  • Spring配置数据源
  • Product Hunt 每日热榜 | 2025-11-02
  • 基于图像的三维重建
  • 越秀区做网站河南网站建设价格与方案
  • 什么网站的新闻做参考文献中信建设有限责任公司属于央企吗
  • 硬件工程师-基础知识(一)
  • 都匀经济开发区建设局网站无锡电子商务网站制作
  • html5 input[type=date]如何让日期中的年/月/日改成英文
  • 嘉兴城乡建设局网站株洲seo优化哪家好
  • 【开题答辩全过程】以 法律类教辅平台为例,包含答辩的问题和答案