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引擎,确保服务稳定性

  • 精准提取:严格保持原文内容,不增删改写

  1. 翻译服务:
  • 翻译引擎:小牛翻译API,专业翻译服务

  • 语言支持:支持中英文互译,可扩展其他语言

  • 自动检测:智能判断原文语种,自动选择翻译方向

  1. 截图技术:
  • 使用mss库进行高效屏幕捕获

  • 支持高DPI屏幕显示

  • 区域选择精准,操作流畅

七、特色亮点

操作便捷:快捷键一键触发,简单易用

识别准确:AI OCR技术,文字识别精度高

翻译专业:专业翻译引擎,译文质量可靠

实时显示:独立悬浮窗口,结果展示清晰

双重保障:主备OCR方案,确保服务稳定

界面美观:深色主题设计,视觉效果舒适

代码开源:可自定义修改,满足个性化需求

八、注意事项

  1. 使用前请确保网络连接正常,OCR和翻译服务需要联网

  2. 首次使用可能需要配置相关API密钥

  3. 截图时请确保目标区域文字清晰可见

  4. 对于特殊字体或复杂背景的图片,识别准确率可能受影响

  5. 本工具仅适用于一般图片翻译,专业领域翻译建议人工校对

九、界面展示

十、源码展示

python 复制代码
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_en
        res = 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 = None
    start_x = start_y = 0
    area = [0, 0, 0, 0]
 
    # 设置DPI感知
    try:
        ctypes.windll.user32.SetProcessDPIAware()
    except:
        pass
 
    def on_mouse_down(event):
        nonlocal start_x, start_y, rect
        start_x, start_y = event.x, event.y
        rect = canvas.create_rectangle(start_x, start_y, start_x, start_y, outline="red", width=3)
 
    def on_mouse_move(event):
        nonlocal rect
        if rect:
            canvas.coords(rect, start_x, start_y, event.x, event.y)
 
    def on_mouse_up(event):
        nonlocal area
        x1, 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 = region
        width = 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 = 12
        self.is_zoomed = False
        self.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 = True
        self.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 图片转为 base64
        buffered = 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.content
            if content:
                content = content.replace("<|begin_of_box|>", "").replace("<|end_of_box|>", "")
                return content
            else:
                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
            # 如果安装了Tesseract
            text = 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.Image
            text = 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 traceback
            error_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 = 16
            self.label.config(font=('微软雅黑', self.font_size, 'bold'))
            self.is_zoomed = True
        else:
            # 恢复原字体
            self.font_size = 12
            self.label.config(font=('微软雅黑', self.font_size))
            self.is_zoomed = False
    def 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 = False
        self.root.destroy()
 
    def run(self):
        self.root.mainloop()
 
if __name__ == "__main__":
    app = TranslationApp()
    app.run()

十一、源码软件下载

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

相关推荐
用什么都重名3 小时前
DeepSeek-OCR 深度解析
人工智能·ocr·deepseek-ocr
lvnacp3 小时前
Qwen3-VL微调自定义OCR任务
ocr
虫师c4 小时前
Python浪漫弹窗程序:Tkinter实现动态祝福窗口教程
python·tkinter·动画效果·gui编程·弹窗效果
灯火不休时5 小时前
95%准确率!CNN交通标志识别系统开源
人工智能·python·深度学习·神经网络·cnn·tensorflow
deephub5 小时前
FastMCP 入门:用 Python 快速搭建 MCP 服务器接入 LLM
服务器·人工智能·python·大语言模型·mcp
南宫乘风6 小时前
基于 Flask + APScheduler + MySQL 的自动报表系统设计
python·mysql·flask
番石榴AI6 小时前
基于机器学习优化的主图选择方法(酒店,景点,餐厅等APP上的主图展示推荐)
图像处理·人工智能·python·机器学习
qq7422349846 小时前
Python操作数据库之pyodbc
开发语言·数据库·python
2401_841495647 小时前
【自然语言处理】轻量版生成式语言模型GPT
人工智能·python·gpt·深度学习·语言模型·自然语言处理·transformer