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 requests
    import json
    url = "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 = True
        self.canvas.bind('<Button-1>', onLeftButtonDown)
        #鼠标左键移动,显示选取的区域
        def onLeftButtonMove(event):
            if not self.sel:
                return
            global lastDraw
            try:
                #删除刚画完的图形,要不然鼠标移动的时候是黑乎乎的一片矩形
                self.canvas.delete(lastDraw)
            except Exception as e:
                pass
            lastDraw = 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 pic
            self.sel = False
            try:
                self.canvas.delete(lastDraw)
            except Exception as e:
                pass
            sleep(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()

效果

我们试一下对下面这张图片进行翻译

日文字符过滤 python python 日语_ide


翻译结果

日文字符过滤 python python 日语_屏幕截图_02


还行吧就是界面丑了点

实时翻译

源代码

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 = True
        self.canvas.bind('<Button-1>', onLeftButtonDown)
        #鼠标左键移动,显示选取的区域
        def onLeftButtonMove(event):
            if not self.sel:
                return
            global lastDraw
            try:
                #删除刚画完的图形,要不然鼠标移动的时候是黑乎乎的一片矩形
                self.canvas.delete(lastDraw)
            except Exception as e:
                pass
            lastDraw = 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 pic
            global imdata
            self.sel = False
            try:
                self.canvas.delete(lastDraw)
            except Exception as e:
                pass
            sleep(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 requests
    import json
    url = "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 ret
    except 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 strx
    except Exception as identifier:
        return " "

def morewile():
    global string
    while 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 flag
    global 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 = 1
    thread = threading.Thread(target = morewile)
    thread.start()
    # clipboard.copy(strx)
def trStop():
    global flag
    flag = 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()

效果

其实和上面一样,只不过设定区域之后对该区域进行多此截图翻译

扩充

其实通过代码可以看出来只要动一下几个参数就可以翻译其他语言了,这里我就不直接写明了,大家可以自己查阅一下。