python3 日文截图翻译和实时翻译
生活随笔
收集整理的這篇文章主要介紹了
python3 日文截图翻译和实时翻译
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
python3 日文截圖翻譯
- 截圖翻譯
- 源代碼
- 效果
- 實時翻譯
- 源代碼
- 效果
- 擴充
最近一直在玩日文游戲,可惜看不懂日文。在自己動手解包漢化無果后無奈之下只能寫一個日文的截圖翻譯。
以下是完整代碼。
注意百度ocr的參數請填寫成自己的
截圖翻譯
源代碼
import tkinter from tkinter import * import os from PIL import ImageGrab from time import sleep from aip import AipOcr # import clipboard root = tkinter.Tk() #設置窗口大小 root.geometry('300x350') #設置窗口名字 root.title('日文截圖翻譯') #設置窗口大小不可改變 root.resizable(False, False) #用來顯示全屏幕截圖并響應二次截圖的窗口類 def my_translate(in_str):import requestsimport jsonurl = "https://aidemo.youdao.com/trans"data = {"q": in_str,"from": "ja","to": "zh-CHS"}headers = {"User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36","Referer": "https://ai.youdao.com/product-fanyi.s"}response = requests.post(url, data=data, headers=headers)html_str = response.content.decode() # json字符串dict_ret = json.loads(html_str)ret = dict_ret["translation"]# print("翻譯結果是:", ret)# print("\n")return ret def get_file_content(filePath):with open(filePath, 'rb') as fp:os.remove(filePath)return fp.read() def vcode2str(img_url):""" 你的 APPID AK SK """APP_ID = "you's APP_ID"API_KEY = "you's API_KEY"SECRET_KEY = "you's SECRET_KEY"client = AipOcr(APP_ID, API_KEY, SECRET_KEY)image = get_file_content(img_url)""" 調用通用文字識別, 圖片參數為本地圖片 """client.basicGeneral(image);""" 如果有可選參數 """options = {}options["language_type"] = "JAP"options["detect_direction"] = "false"options["detect_language"] = "false"options["probability"] = "false"""" 帶參數調用通用文字識別, 圖片參數為本地圖片 """res=client.basicGeneral(image, options)strx=""for tex in res["words_result"]:#遍歷結果strx+=tex["words"]#每一行strx+="\n"return strx class MyCapture:def __init__(self, png):#變量X和Y用來記錄鼠標左鍵按下的位置self.X = tkinter.IntVar(value=0)self.Y = tkinter.IntVar(value=0)#屏幕尺寸screenWidth = root.winfo_screenwidth()screenHeight = root.winfo_screenheight()#創建頂級組件容器self.top = tkinter.Toplevel(root, width=screenWidth, height=screenHeight)#不顯示最大化、最小化按鈕self.top.overrideredirect(True)self.canvas = tkinter.Canvas(self.top,bg='white', width=screenWidth, height=screenHeight)#顯示全屏截圖,在全屏截圖上進行區域截圖self.image = tkinter.PhotoImage(file=png)self.canvas.create_image(screenWidth//2, screenHeight//2, image=self.image)#鼠標左鍵按下的位置def onLeftButtonDown(event):self.X.set(event.x)self.Y.set(event.y)#開始截圖self.sel = Trueself.canvas.bind('<Button-1>', onLeftButtonDown)#鼠標左鍵移動,顯示選取的區域def onLeftButtonMove(event):if not self.sel:returnglobal lastDrawtry:#刪除剛畫完的圖形,要不然鼠標移動的時候是黑乎乎的一片矩形self.canvas.delete(lastDraw)except Exception as e:passlastDraw = self.canvas.create_rectangle(self.X.get(), self.Y.get(), event.x, event.y, outline='black')self.canvas.bind('<B1-Motion>', onLeftButtonMove)#獲取鼠標左鍵抬起的位置,保存區域截圖def onLeftButtonUp(event):global picself.sel = Falsetry:self.canvas.delete(lastDraw)except Exception as e:passsleep(0.1)#考慮鼠標左鍵從右下方按下而從左上方抬起的截圖left, right = sorted([self.X.get(), event.x])top, bottom = sorted([self.Y.get(), event.y])pic = ImageGrab.grab((left+1, top+1, right, bottom))#彈出保存截圖對話框pic.save('./temp.png')#關閉當前窗口self.top.destroy()self.canvas.bind('<ButtonRelease-1>', onLeftButtonUp) #讓canvas充滿窗口,并隨窗口自動適應大小self.canvas.pack(fill=tkinter.BOTH, expand=tkinter.YES)#開始截圖 def buttonCaptureClick():#最小化主窗口root.state('icon')sleep(0.5)filename = 'temp.png' #grab()方法默認對全屏幕進行截圖im = ImageGrab.grab()im.save(filename)im.close()#顯示全屏幕截圖w = MyCapture(filename)buttonCapture.wait_window(w.top)root.state('normal')strx = vcode2str("./temp.png")strx = my_translate(strx)# clipboard.copy(strx)T.delete('1.0','end')T.insert(END, strx)#截圖結束,恢復主窗口,并刪除臨時的全屏幕截圖文件 buttonCapture = tkinter.Button(root, text='截圖', command=buttonCaptureClick) T = Text(root, height=15, width=100) T.pack(side=LEFT) buttonCapture.place(x=110, y=10, width=80, height=20) #啟動消息主循環 root.mainloop()效果
我們試一下對下面這張圖片進行翻譯
翻譯結果
還行吧就是界面丑了點
實時翻譯
源代碼
import tkinter from tkinter import * import os from PIL import ImageGrab from time import sleep from aip import AipOcr import numpy as np from PIL import Image import threading #用來顯示全屏幕截圖并響應二次截圖的窗口類 imdata =()#接收截圖位置的全局變量 flag = 0#控制實時翻譯開關 string = ""#儲存上次翻譯結果的變量 class MyCapture:def __init__(self, png):#變量X和Y用來記錄鼠標左鍵按下的位置self.X = tkinter.IntVar(value=0)self.Y = tkinter.IntVar(value=0)#屏幕尺寸screenWidth = root.winfo_screenwidth()screenHeight = root.winfo_screenheight()#創建頂級組件容器self.top = tkinter.Toplevel(root, width=screenWidth, height=screenHeight)#不顯示最大化、最小化按鈕self.top.overrideredirect(True)self.canvas = tkinter.Canvas(self.top,bg='white', width=screenWidth, height=screenHeight)#顯示全屏截圖,在全屏截圖上進行區域截圖self.image = tkinter.PhotoImage(file=png)self.canvas.create_image(screenWidth//2, screenHeight//2, image=self.image)#鼠標左鍵按下的位置def onLeftButtonDown(event):self.X.set(event.x)self.Y.set(event.y)#開始截圖self.sel = Trueself.canvas.bind('<Button-1>', onLeftButtonDown)#鼠標左鍵移動,顯示選取的區域def onLeftButtonMove(event):if not self.sel:returnglobal lastDrawtry:#刪除剛畫完的圖形,要不然鼠標移動的時候是黑乎乎的一片矩形self.canvas.delete(lastDraw)except Exception as e:passlastDraw = self.canvas.create_rectangle(self.X.get(), self.Y.get(), event.x, event.y, outline='black')self.canvas.bind('<B1-Motion>', onLeftButtonMove)#獲取鼠標左鍵抬起的位置,保存區域截圖def onLeftButtonUp(event):global picglobal imdataself.sel = Falsetry:self.canvas.delete(lastDraw)except Exception as e:passsleep(0.5)#考慮鼠標左鍵從右下方按下而從左上方抬起的截圖left, right = sorted([self.X.get(), event.x])top, bottom = sorted([self.Y.get(), event.y])imdata = (left+1,top+1,right,bottom)#關閉當前窗口self.top.destroy()self.canvas.bind('<ButtonRelease-1>', onLeftButtonUp) #讓canvas充滿窗口,并隨窗口自動適應大小self.canvas.pack(fill=tkinter.BOTH, expand=tkinter.YES)def my_translate(in_str):import requestsimport jsonurl = "https://aidemo.youdao.com/trans"data = {"q": in_str,"from": "ja","to": "zh-CHS"}headers = {"User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36","Referer": "https://ai.youdao.com/product-fanyi.s"}response = requests.post(url, data=data, headers=headers)html_str = response.content.decode() # json字符串dict_ret = json.loads(html_str)try:ret = dict_ret["translation"]return retexcept Exception as identifier:return "翻譯錯誤" def get_file_content(filePath):with open(filePath, 'rb') as fp:os.remove(filePath)return fp.read() def vcode2str(image):""" 你的 APPID AK SK """APP_ID = "you's APP_ID"API_KEY = "you's API_KEY"SECRET_KEY = "you's SECRET_KEY"client = AipOcr(APP_ID, API_KEY, SECRET_KEY)# image = get_file_content(img_url)""" 調用通用文字識別, 圖片參數為本地圖片 """# image = Image.fromarray(np.uint8(image)).tobytes()client.basicGeneral(image);""" 如果有可選參數 """options = {}options["language_type"] = "JAP"options["detect_direction"] = "false"options["detect_language"] = "false"options["probability"] = "false"""" 帶參數調用通用文字識別, 圖片參數為本地圖片 """res=client.basicGeneral(image, options)strx=""try:for tex in res["words_result"]:#遍歷結果strx+=tex["words"]#每一行strx+="\n"return strxexcept Exception as identifier:return " "def morewile():global stringwhile flag ==1:im = ImageGrab.grab(imdata)im.save('./temp.png')strx = vcode2str(get_file_content("./temp.png"))strx = my_translate(strx)if string != strx:T.delete('1.0','end')T.insert(END, strx)# sleep(1) def buttonCaptureClick():global flagglobal imdata#最小化主窗口# root.state('icon')# sleep(0.5)filename = 'temp.png'#grab()方法默認對全屏幕進行截圖im = ImageGrab.grab()im.save(filename)im.close()#顯示全屏幕截圖w = MyCapture(filename)buttonCapture.wait_window(w.top)root.state('normal')flag = 1thread = threading.Thread(target = morewile)thread.start()# clipboard.copy(strx) def trStop():global flagflag = 0 # import clipboard root = tkinter.Tk() #設置窗口大小 root.geometry('300x350') #設置窗口名字 root.title('日文截圖翻譯') #設置窗口大小不可改變 root.resizable(False, False) buttonCapture = tkinter.Button(root, text='截圖', command=buttonCaptureClick) buttonStop = tkinter.Button(root, text='結束', command=trStop) T = Text(root, height=15, width=100) T.pack(side=LEFT) buttonCapture.place(x=50, y=10, width=80, height=20) buttonStop.place(x=160, y=10, width=80, height=20) #啟動消息主循環 root.mainloop()效果
其實和上面一樣,只不過設定區域之后對該區域進行多此截圖翻譯
擴充
其實通過代碼可以看出來只要動一下幾個參數就可以翻譯其他語言了,這里我就不直接寫明了,大家可以自己查閱一下。
總結
以上是生活随笔為你收集整理的python3 日文截图翻译和实时翻译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国数学家黄金一代-北大数学专业2000
- 下一篇: 有 ABCD 四个人要在夜里过一座桥,他