Python 批量翻译图片 附详细代码
环境:Python3.7
原文链接:Python 批量翻译图片 附详细代码_艽野尘梦better的博客-CSDN博客
有道智云API
想要批量翻译图片,并将翻译内容合并在原图片上,即不改变图片背景,翻译图片中的英文(例如下面两张图),我们可以使用有道智云(当然也有网易有道词典、搜狗、QQ截图翻译和微信截图翻译,这里面微信截图翻译个人认为效果最好)提供的翻译服务,而不需要知道具体的算法细节(毕竟大厂的翻译算法肯定比自己训练的牛)。
但是当我们有一堆图片需要翻译的时候,一个一个上传到网站上翻译太过繁琐,这时候就可以用到Python调用翻译网站提供的服务接口,实现批量图片翻译。
调用接口的代码
其实有道智云的技术文档里面已经给出了Python3以及其他语言调用接口的示例代码,我们只需要根据自己的需求稍加修改即可。
# -*- coding: utf-8 -*-
import sys
import uuid
import requests
import base64
import hashlib
import os
from imp import reload
reload(sys)
YOUDAO_URL = 'https://openapi.youdao.com/ocrtransapi'
APP_KEY = '###########'#自己申请
APP_SECRET = '#############'#自己申请
def encrypt(signStr):#对请求参数中的某些内容进行哈希编码
hash_algorithm = hashlib.md5()
hash_algorithm.update(signStr.encode('utf-8'))
return hash_algorithm.hexdigest()
def do_request(data):#发送请求
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
return requests.post(YOUDAO_URL, data=data, headers=headers)
def connect(file_in):#接口访问参数设置与发送请求
f = open(file_in, 'rb') # 二进制方式打开图文件
q = base64.b64encode(f.read()).decode('utf-8') # 读取文件内容,转换为base64编码
f.close()
data = {}
data['from'] = 'en'
data['to'] = 'zh-CHS'
data['type'] = '1'
data['q'] = q
salt = str(uuid.uuid1())
signStr = APP_KEY + q + salt + APP_SECRET
sign = encrypt(signStr)
data['appKey'] = APP_KEY
data['salt'] = salt
data['sign'] = sign
data['render']=1
response = do_request(data)
return response
注意想要调用接口还需要获得应用ID和应用密钥(获得后替换代码中对应位置),只需要点击下图中的立即使用,注册登录即可,由于翻译服务是需要付费的,大概几分钱一张,不过新用户会赠送50元的体验金,那么相当于批量翻译1w张以上的图片。
这里需要注意一个参数render,他表示用户是否需要返回翻译后渲染的图片,默认为否,我们改为1(是)即可得到翻译后的图片。
调用之后返回的是json格式的数据,其中不仅包括图片数据,还有诸多其他的数据,找到其中的图像数据后,将其转变编码后保存到.png文件中。
下面的代码里还有一些读取需要翻译图片的文件夹中的所有图片路径,以及保存翻译后的图片的文件夹路径(自行修改),这样就可以实现批量翻译图片啦~
def str_to_png(image_json,file_out):
image_str=image_json.encode('ascii')
image_byte = base64.b64decode(image_str)
with open(file_out,'wb') as f:
f.write(image_byte)
f.close
if __name__ == '__main__':
file_dir1=r'C:\Users\图片\\'#原图片的文件夹
file_dir2=r'C:\Users\图片翻译结果\\'#翻译后图片的文件夹
paths_tuple=os.walk(file_dir1)#返回三元组,包括路径,文件名
for root, dirs, files in paths_tuple:
for file in files:
split_file=os.path.splitext(file)#拆分成文件名和类型
if split_file[1] == '.png':#只处理.png图片
file_in=os.path.join(root, file)
file_out=os.path.join(file_dir2, file)
response=connect(file_in)#调用接口
str_to_png(response.json()['render_image'],file_out)#保存图片