Python实现图片转文字并翻译至剪切板

一、环境搭建:

  1、PySimpleGUI: pip3 install pysimplegui

  2、pytesseract需要有tesseract环境才行:

    1. 先搭建tesseract:

      brew install tesseract  /*安装tesseract环境*/

      brew install tesseract-lang   /*安装语言包,大概有600+M,心痛。。*/

    2. 安装pytesseract

      pip3 install pytesseract

二、基本流程:

  1、设计一个窗口,支持上传图片文件和相关参数设定。大概长这样:

GUI代码

想要学习Python?Python学习交流群:973783996满足你的需求,资料都已经上传群文件,可以自行下载!

import PySimpleGUI as sg
event,values = sg.Window('选择转文字照片'). Layout([
                                                   [sg.Text('上传照片')],
                                                   [sg.Input(), sg.FileBrowse('选择文件')],
                                                   [sg.Radio('开启翻译','flag'),sg.Radio('中/英', "choose")],
                                                   [sg.OK('确认'), sg.Cancel('取消')]
                                                ]).Read()

 分支控制: 

if values[1]:
   if values[2]:
      res = translate(text, 'en', 'zh')
   else:
      res = translate(text, 'zh', 'en')
   text = ''
   for ans in res['trans_result']:
      text+=ans['dst']+'\n'

2、图片转文字:

这里主要用到的是pytesseract库,引用库以后一行代码就搞定了。

text=pytesseract.image_to_string(Image.open(values[0]),lang='chi_sim')

参数:values[0]是上传图片的地址,lang代表文字识别语言

3、调用百度翻译api:

首先去百度翻译开发者平台注册申请api:百度翻译开放平台

然后在控制台的开发者信息里,会有你的appid和密钥:

根据官方提供的demo,我撸了一个调用函数:

def translate(q,fromLang,toLang):
    # q代表需要翻译的语句、fromlang是待翻译语言、tolang是翻译成的语言
   appid = '你的appid'
   secretKey = '你的密钥'
   httpClient = None
   myurl = '/api/trans/vip/translate'
   salt = random.randint(32768, 65536)
   sign = appid+q+str(salt)+secretKey
   m1 = hashlib.md5()
   m1.update(sign.encode(encoding='utf-8'))
   sign = m1.hexdigest()
   myurl = myurl+'?appid='+appid+'&q='+parse.quote(q)+'&from='+fromLang+'&to='+toLang+'&salt='+str(salt)+'&sign='+sign
   try:
      httpClient = http.client.HTTPConnection('api.fanyi.baidu.com')
      httpClient.request('GET', myurl)
      response = httpClient.getresponse()
      ans = response.read().decode('utf-8')
      ans = eval(ans)
   except Exception as e:
      print(e)
   finally:
      if httpClient:
         httpClient.close()
      if ans:
         return ans

百度翻译api调用

4、调用剪切板:

利用subprocess库,按照基本使用方法直接用就好。

text=bytes(text,'utf8')
p = subprocess.Popen(['pbcopy'], stdin=subprocess.PIPE)
p.stdin.write(text)
p.stdin.close()
p.communicate()

三、完整代码:

from PIL import Image
import pytesseract
import subprocess
import PySimpleGUI
import PySimpleGUI as sg
import http.client
import hashlib
from urllib import parse
import random

def translate(q,fromLang,toLang):
   appid = '你的appid'
   secretKey = '你的密钥'
   httpClient = None
   myurl = '/api/trans/vip/translate'
   salt = random.randint(32768, 65536)
   sign = appid+q+str(salt)+secretKey
   m1 = hashlib.md5()
   m1.update(sign.encode(encoding='utf-8'))
   sign = m1.hexdigest()
   myurl = myurl+'?appid='+appid+'&q='+parse.quote(q)+'&from='+fromLang+'&to='+toLang+'&salt='+str(salt)+'&sign='+sign
   try:
      httpClient = http.client.HTTPConnection('api.fanyi.baidu.com')
      httpClient.request('GET', myurl)
      response = httpClient.getresponse()
      ans = response.read().decode('utf-8')
      ans = eval(ans)
   except Exception as e:
      print(e)
   finally:
      if httpClient:
         httpClient.close()
      if ans:
         return ans

event,values = sg.Window('选择转文字照片'). Layout([
                                                   [sg.Text('上传照片')],
                                                   [sg.Input(), sg.FileBrowse('选择文件')],
                                                   [sg.Radio('开启翻译','flag'),sg.Radio('中/英', "choose")],
                                                   [sg.OK('确认'), sg.Cancel('取消')]
                                                ]).Read()
if event=='取消':
    exit('no image file selected!')

text=pytesseract.image_to_string(Image.open(values[0]),lang='chi_sim');
text=str(text).replace('\n','')
if values[1]:
   if values[2]:
      res = translate(text, 'en', 'zh')
   else:
      res = translate(text, 'zh', 'en')
   text = ''
   for ans in res['trans_result']:
      text+=ans['dst']+'\n'
text=bytes(text,'utf8')
p = subprocess.Popen(['pbcopy'], stdin=subprocess.PIPE)
p.stdin.write(text)
p.stdin.close()
p.communicate()

Source Code

猜你喜欢

转载自blog.csdn.net/fei347795790/article/details/89313210