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

十、源碼展示
import os
import tkinter as tk
from urllib import parse, request
import json
import keyboard # 監(jiān)聽(tīng)快捷鍵
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"翻譯接口錯(cuò)誤: {str(e)}"
# ================== 框選截圖區(qū)域 ==================
def select_area():
# 預(yù)初始化Tkinter,避免第一次創(chuàng)建窗口時(shí)的跳動(dòng)
root = tk.Tk()
root.withdraw() # 隱藏預(yù)初始化窗口
root.update_idletasks()
# 創(chuàng)建實(shí)際的全屏窗口
root = tk.Tk()
root.attributes("-fullscreen", True)
root.attributes("-alpha", 0.3)
# 設(shè)置窗口位置確保不會(huì)影響主界面
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]
# 設(shè)置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
# 直接使用坐標(biāo),不進(jìn)行縮放轉(zhuǎn)換
# MSS會(huì)自動(dòng)處理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ū)域坐標(biāo)正確
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)
# 保存截圖用于調(diào)試
#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")
# ================== 主應(yīng)用 ==================
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()
# 注冊(cè)截圖快捷鍵
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 圖片轉(zhuǎn)為 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": "請(qǐng)準(zhǔn)確提取圖片中的文字信息,不增加、刪除或改寫(xiě)其它文本內(nèi)容。"
}
]
}]
)
content = response.choices[0].message.content
if content:
content = content.replace("<|begin_of_box|>", "").replace("<|end_of_box|>", "")
return content
else:
return "未識(shí)別到文字"
except Exception as e:
print(f"AI OCR錯(cuò)誤: {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 "未識(shí)別到文字(備用OCR)"
except:
return "OCR服務(wù)不可用,請(qǐng)檢查網(wǎng)絡(luò)連接或AI密鑰"
def capture_and_translate(self):
try:
#print("開(kāi)始截圖...")
# 選擇截圖區(qū)域
region = select_area()
#print(f"選擇的區(qū)域: {region}")
if region[0] == region[2] or region[1] == region[3]:
self.update_display("無(wú)效的截圖區(qū)域")
return
# 使用 mss 截圖
screenshot = capture_region(region)
# 保存截圖用于調(diào)試
#screenshot.save("debug_pil_screenshot.png")
#print("PIL screenshot saved as debug_pil_screenshot.png")
# 顯示"識(shí)別中..."提示
self.update_display("識(shí)別中...")
# 調(diào)用 AI OCR,直接傳 PIL.Image
text = self.process_image_with_ai(screenshot).strip()
#print(f"識(shí)別結(jié)果: {text}")
if text and text != "未識(shí)別到文字":
self.last_text = text
# 顯示"翻譯中..."提示
self.update_display(f"原文: {text}\n翻譯中...")
# 翻譯文本
translation = self.translate_text(text)
#print(f"翻譯結(jié)果: {translation}")
self.update_display(f"原文: {text}\n\n譯文: {translation}")
else:
self.update_display("未識(shí)別到文字")
except Exception as e:
import traceback
error_msg = f"錯(cuò)誤: {str(e)}\n{traceback.format_exc()}"
print(error_msg)
self.update_display(f"處理錯(cuò)誤:\n{str(e)}")
def update_display(self, text):
self.label.config(text=text)
self.root.update_idletasks()
def copy_to_clipboard(self):
"""復(fù)制原文和譯文到剪貼板"""
if self.last_text:
try:
# 獲取當(dāng)前顯示的文本
current_text = self.label.cget("text")
self.root.clipboard_clear()
self.root.clipboard_append(current_text)
# 臨時(shí)顯示復(fù)制成功提示
original_text = self.label.cget("text")
self.label.config(text="已復(fù)制到剪貼板!")
self.root.after(1500, lambda: self.label.config(text=original_text))
except Exception as e:
print(f"復(fù)制失敗: {e}")
def zoom_text(self):
"""放大/恢復(fù)文本字體"""
if not self.is_zoomed:
# 放大字體
self.font_size = 16
self.label.config(font=('微軟雅黑', self.font_size, 'bold'))
self.is_zoomed = True
else:
# 恢復(fù)原字體
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)
# 右上角復(fù)制按鈕
copy_btn = tk.Button(control_frame, text="復(fù)制",
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實(shí)現(xiàn)圖片識(shí)別翻譯工具功能(附源碼)的詳細(xì)內(nèi)容,更多關(guān)于Python OCR圖片識(shí)別翻譯的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python處理xls文件openpyxl基礎(chǔ)操作
這篇文章主要為大家介紹了python處理xls文件openpyxl基礎(chǔ)操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
pandas數(shù)據(jù)的合并concat()和merge()方式
Pandas中concat沿軸合并數(shù)據(jù)框(行或列),merge基于鍵連接(內(nèi)/外/左/右),concat用于縱向或橫向拼接,merge用于關(guān)聯(lián)數(shù)據(jù),如合并訂單與客戶信息2025-08-08
Python通過(guò)BeautifulSoup抓取網(wǎng)頁(yè)數(shù)據(jù)并解析
這篇文章主要為大家介紹了如何使用Python的異步爬蟲(chóng)技術(shù)抓取網(wǎng)頁(yè)內(nèi)容,并使用BeautifulSoup解析特定div中的文本,感興趣的小伙伴可以了解下2025-08-08
基于Django實(shí)現(xiàn)日志記錄報(bào)錯(cuò)信息
這篇文章主要介紹了基于Django實(shí)現(xiàn)日志記錄報(bào)錯(cuò)信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
使用seaborn繪制強(qiáng)化學(xué)習(xí)中的圖片問(wèn)題
這篇文章主要介紹了使用seaborn繪制強(qiáng)化學(xué)習(xí)中的圖片問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01

