Python 批量翻译图片 附详细代码

环境:Python3.7

目录

概念解释

有道智云 API

调用接口的代码

实现批量处理

概念解释

图片翻译:基于文字识别与文本翻译技术,结合组段和渲染技术,满足用户翻译图片文字的需求,提升输入效率。

有道智云 API

想要批量翻译图片,并将翻译内容合并在原图片上,即不改变图片背景,翻译图片中的英文(例如下面两张图),我们可以使用有道智云(当然也有网易有道词典、搜狗、QQ 截图翻译和微信截图翻译,这里面微信截图翻译个人认为效果最好)提供的翻译服务,而不需要知道具体的算法细节(毕竟大厂的翻译算法肯定比自己训练的牛)。

但是当我们有一堆图片需要翻译的时候,一个一个上传到网站上翻译太过繁琐,这时候就可以用到 Python 调用翻译网站提供的服务接口,实现批量图片翻译。有道的图片翻译 API 接口提供有道的图片文字识别翻译服务。只需要通过调用图片翻译 API,传入图片的 Base64 编码,指定源语言与目标语言,通过 POST 请求方式,就可以识别图片中的文字并进行翻译。

调用接口的代码

其实有道智云的技术文档里面已经给出了 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 文件中。所有返回参数说明见下表:

字段名字段说明
orientation图片所对应的方向
lanFromocr 所识别出来认为的图片中的语言
textAngle图片的倾斜角度
errorCode错误码
lanTo目标语言
resRegions图片翻译的具体内容
-boundingBox区域范围,四个值:
左上角的 x 值,左上角的 y 值,区域的的宽,区域的高
例如:134,0,1066,249
-linesCount行数(用于前端排版)
-lineheight行高
-context该区域的原文
-linespace行间距
-tranContent翻译结果
-lines当 render=1 即返回渲染图片,返回结果 lines
-color图片颜色(默认字段,暂不支持修改)
-words字数组,当 render=1 即返回渲染图片
-text行识别结果,当 render=1 即返回渲染图片
-word识别的字的结果,当 render=1 即返回渲染图片
-textHeight文字的高度,当 render=1 即返回渲染图片

实现批量处理

下面的代码里还有一些读取需要翻译图片的文件夹中的所有图片路径,以及保存翻译后的图片的文件夹路径(自行修改),循环对路径中图片进行翻译和保存,这样就可以实现批量翻译图片啦~

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)#保存图片
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艽野尘梦better

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值