Python基于OCR實現圖片識別翻譯工具功能(附源碼)
一、軟件名稱
OCR圖片識別翻譯工具
二、軟件簡介
本軟件主要解決用戶在閱讀外文圖片、截圖或界面文字時遇到的語言障礙痛點。通過智能OCR文字識別和精準翻譯技術,實現一鍵截圖翻譯,大幅提升跨語言閱讀效率,讓語言不再成為信息獲取的障礙。
三、軟件功能
本軟件是一款基于AI技術的智能OCR識別翻譯工具,主要功能包括:
1. 智能區(qū)域截圖:支持自定義框選截圖區(qū)域,精準捕獲需要翻譯的內容
2. AI文字識別:采用先進的AI OCR技術,準確提取圖片中的文字信息
3. 智能翻譯引擎:集成小牛翻譯API,支持英漢互譯
4. 自動語言檢測:智能識別原文語種,自動選擇翻譯方向
5. 結果展示窗口:提供獨立的懸浮窗口顯示識別和翻譯結果
6. 文本復制功能:支持一鍵復制原文和譯文到剪貼板
7. 字體縮放:提供文本放大顯示功能,便于閱讀長文本內容
四、使用方法和操作步驟
運行程序后,桌面會出現一個懸浮翻譯窗口
按下快捷鍵 Ctrl+Alt+A 激活截圖功能,或者點界面上的截圖鍵開始截圖
用鼠標框選需要識別翻譯的屏幕區(qū)域
程序自動識別區(qū)域內的文字并顯示"識別中..."提示
識別完成后自動進行翻譯并顯示"翻譯中..."提示
在懸浮窗口中同時顯示原文和譯文結果
可點擊"復制"按鈕將內容復制到剪貼板
五、運行環(huán)境
系統(tǒng)要求:Windows操作系統(tǒng)
Python環(huán)境:需要安裝相關依賴庫(PIL、tkinter、keyboard、mss等)
運行方式:直接運行Python腳本
六、技術特點說明
1. OCR識別技術
主方案:基于智譜AI的GLM-4V視覺模型,準確率高
備用方案:集成Tesseract OCR引擎,確保服務穩(wěn)定性
精準提?。簢栏癖3衷膬热荩辉鰟h改寫
2. 翻譯服務
翻譯引擎:小牛翻譯API,專業(yè)翻譯服務
語言支持:支持中英文互譯,可擴展其他語言
自動檢測:智能判斷原文語種,自動選擇翻譯方向
3. 截圖技術
使用mss庫進行高效屏幕捕獲
支持高DPI屏幕顯示
區(qū)域選擇精準,操作流暢
七、特色亮點
操作便捷:快捷鍵一鍵觸發(fā),簡單易用
識別準確:AI OCR技術,文字識別精度高
翻譯專業(yè):專業(yè)翻譯引擎,譯文質量可靠
實時顯示:獨立懸浮窗口,結果展示清晰
雙重保障:主備OCR方案,確保服務穩(wěn)定
界面美觀:深色主題設計,視覺效果舒適
代碼開源:可自定義修改,滿足個性化需求
八、注意事項
1. 使用前請確保網絡連接正常,OCR和翻譯服務需要聯網
2. 首次使用可能需要配置相關API密鑰
3. 截圖時請確保目標區(qū)域文字清晰可見
4. 對于特殊字體或復雜背景的圖片,識別準確率可能受影響
5. 本工具僅適用于一般圖片翻譯,專業(yè)領域翻譯建議人工校對
九、界面展示

十、源碼展示
import os
import tkinter as tk
from urllib import parse, request
import json
import keyboard # 監(jiān)聽快捷鍵
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)}"
# ================== 框選截圖區(qū)域 ==================
def select_area():
# 預初始化Tkinter,避免第一次創(chuàng)建窗口時的跳動
root = tk.Tk()
root.withdraw() # 隱藏預初始化窗口
root.update_idletasks()
# 創(chuàng)建實際的全屏窗口
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 按區(qū)域截圖,返回 PIL.Image"""
with mss.mss() as sct:
# 確保區(qū)域坐標正確
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("開始截圖...")
# 選擇截圖區(qū)域
region = select_area()
#print(f"選擇的區(qū)域: {region}")
if region[0] == region[2] or region[1] == region[3]:
self.update_display("無效的截圖區(qū)域")
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()以上就是Python基于OCR實現圖片識別翻譯工具功能(附源碼)的詳細內容,更多關于Python OCR圖片識別翻譯的資料請關注腳本之家其它相關文章!

