#緒言
PDFや画像中の英文をさくっと翻訳したかった。
#コード全体
↓の記事をかなり参考にさせていただきました(ありがてえです)。
範囲指定に関してはこちらの記事参照ください。
area_translator.py
import os
import tkinter
from tkinter import messagebox
import pyautogui
from PIL import Image, ImageTk, ImageEnhance, ImageOps
import pyocr
import pyocr.builders
from googletrans import Translator
import re
RESIZE_RETIO = 1.5
# Tesseractのパスを通す
path_tesseract = "C:\Program Files\Tesseract-OCR"
if path_tesseract not in os.environ["PATH"].split(os.pathsep):
os.environ["PATH"] += os.pathsep + path_tesseract
# OCRエンジンの取得
tools = pyocr.get_available_tools()
tool = tools[0]
# ドラッグ開始時の処理
def start(event):
global start_x, start_y
canvas.delete("rect")
canvas.create_rectangle(event.x, event.y, event.x + 1, event.y + 1,
outline="red", tag="rect")
start_x, start_y = event.x, event.y
# ドラッグ中の処理
def drag(event):
if event.x < 0:
end_x = 0
else:
end_x = min(img_resized.width, event.x)
if event.y < 0:
end_y = 0
else:
end_y = min(img_resized.height, event.y)
canvas.coords("rect", start_x, start_y, end_x, end_y)
# ドラッグ終了時の処理
def release(event):
start_x, start_y, end_x, end_y = [round(n * RESIZE_RETIO) for n in canvas.coords("rect")]
#指定範囲でトリミング
img_region = img.crop((start_x, start_y, end_x, end_y))
#画像を読みやすいように加工。
img_rgb = img_region.convert('RGB')
#反転フラグ取得
wb_flg = bln.get()
if wb_flg: #チェックされている場合(背景黒)
img_rgb2 = ImageOps.invert(img_rgb)
else:
#画像を読みやすいように加工
con_img = ImageEnhance.Contrast(img_rgb)
img_rgb = con_img.enhance(2.0)
imsize = img_rgb.size
img_rgb2 = Image.new('RGB', imsize)
border=200
for x in range(imsize[0]):
for y in range(imsize[1]):
r,g,b=img_rgb.getpixel((x,y))
if r > border or g > border or b > border:
r = 255
g = 255
b = 255
img_rgb2.putpixel((x,y),(r,g,b))
#OCR
builder = pyocr.builders.TextBuilder()#tesseract_layout=6)
txt = tool.image_to_string(img_rgb2, lang='eng', builder=builder)
#改行を無くす処理
txt = re.sub(r'\n',' ',txt)
messagebox.showinfo(u'OCR結果',txt) #確認用
#翻訳機
translator = Translator()
translated = translator.translate(txt, src='en', dest='ja')
txt = translated.text
messagebox.showinfo(u'翻訳機',txt)
#スクショ更新用
def draw_image():
global img, img_tk
img = pyautogui.screenshot()
img_resized = img.resize(size=(int(img.width / RESIZE_RETIO),
int(img.height / RESIZE_RETIO)),
resample=Image.BILINEAR)
img_tk = ImageTk.PhotoImage(img_resized)
canvas.itemconfig(item, image=img_tk)
# メイン処理
if __name__ == "__main__":
img = pyautogui.screenshot()
img_resized = img.resize(size=(int(img.width / RESIZE_RETIO),
int(img.height / RESIZE_RETIO)),
resample=Image.BILINEAR)
root = tkinter.Tk()
img_tk = ImageTk.PhotoImage(img_resized)
canvas = tkinter.Canvas(root,
bg="black",
width=img_resized.width,
height=img_resized.height)
item = canvas.create_image(0, 0, image=img_tk, anchor=tkinter.NW)
#反転フラグボタン
bln = tkinter.BooleanVar()
bln.set(False)
chk = tkinter.Checkbutton(root, variable=bln, text = u'背景黒')
chk.pack(expand=True, side='bottom')
#スクショ更新ボタン
buttontext = tkinter.StringVar()
buttontext.set(u"スクショ更新")
button = tkinter.Button(root, textvariable=buttontext, command=draw_image)
button.pack(expand=True, side='bottom')
canvas.pack()
canvas.bind("<ButtonPress-1>", start)
canvas.bind("<Button1-Motion>", drag)
canvas.bind("<ButtonRelease-1>", release)
root.mainloop()
#内容
###OCR
※Tesseractのインストールが必要です
↓を参考にしました。
###翻訳
googletransのエラーで詰まりましたが、googletrans==4.0.0-rc1のインストールで動きました。
プロキシ設定する場合は↓でいけました
translator = Translator(proxies={'http://hogehoge'})
#結言
ちゃんと英語勉強したほうがいいのかもしれません。