# coding=utf-8
from fontTools.ttLib import TTFont
from PIL import Image, ImageDraw, ImageFont #绘制图片
import numpy, os, platform
import pytesseract #文字识别库,这个包的安装还需要安装tesseract.exe,可以网上搜教程
# coding=utf-8
import requests, base64, re
# from urllib import parse
class Image_Rec_G:
def __init__(self):
self.filepath = ''
# ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
self.client_id = 'fGoDxz' # API Key
self.client_secret = 'AzoegouQlzPI' # Secret Key
self.at_header = {
'Content-type': 'application/json; charset=UTF-8',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
}
self.access_token_url = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + self.client_id + '&client_secret=' + self.client_secret
# ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
self.ia_header = {
'Content-type': 'application/x-www-form-urlencoded',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
}
self.ia_data ={
'image': ''
}
self.api_url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic?access_token='
def get_access_token(self):
'''
1. 鉴权使用的 Access_token
:return:
'''
acc = requests.post(url=self.access_token_url, headers=self.at_header)
access_token_result = eval(acc.content.decode()) # eval 字符串转成字典
return access_token_result['access_token']
def image_option(self):
'''
图片地址base64编码
:return:
'''
with open(self.filepath, 'rb') as fp:
picture = fp.read()
base_picture = base64.b64encode(picture)
str_base_picture = str(base_picture, encoding='utf-8')
return str_base_picture
def get_image_data(self, filepath):
self.filepath = filepath
self.api_url = self.api_url + self.get_access_token()
self.ia_data['image'] = self.image_option()
response = requests.post(url=self.api_url, headers=self.ia_header, data=self.ia_data)
image_rec_result = eval(response.content.decode()) # 字符串转成字典
return image_rec_result
def ttfont_to_img(fontPath, imgname):
'''
出入字体文件名
解析字体文件,绘制出文本类型图片并保存到本地
:param fontPath:
:return:
'''
# fontPath = '447d767f.woff'
font = TTFont(fontPath) # 打开文件
codeList = font.getGlyphOrder()[2:] # 因为开头两个并不是我们所需要的,所以从2开始取
im = Image.new("RGB", (1800, 1000), (255, 255, 255))
dr = ImageDraw.Draw(im) # v#创建绘制对象
font = ImageFont.truetype(fontPath, 40) # #绘制文本
count = 15
arrayList = numpy.array_split(codeList, count) # 将列表切分成15份,以便于在图片上分行显示
for t in range(count):
newList = [i.replace("uni", "\\u") for i in arrayList[t]]
text = "".join(newList)
text = text.encode('utf-8').decode('unicode_escape')
dr.text((0, 50 * t), text, font=font, fill="#000000")
im.save(imgname)
def parse_ttfont(fontname, imgname):
# 字体文件转化为图片
ttfont_to_img(fontname, imgname)
# 图片文字识别
if (platform.system() == 'Windows'):
filepath = os.getcwd().replace('\\', '\\\\') + '\\\\%s' % imgname
elif(platform.system() == 'Linux'):
filepath = os.getcwd().replace('\\', '/') + '/%s' % imgname
im = Image_Rec_G()
result = im.get_image_data(filepath)
if 'words_result' in result.keys() and result['words_result'] != []:
datas = ''.join([i['words'] for i in result['words_result']])
return datas
else:
return 'error'
if __name__ == '__main__':
'''
读取自定义字体文件
解析成人眼可识别正常文字
'''
fontname = '447d767f.woff'
imgname = 'sssss.jpg'
print(parse_ttfont(fontname, imgname))
#
# result = pytesseract.image_to_string(imgname, lang="chi_sim")
# result = result.replace(" ", "").replace("\n", "")
# codeList = [i.replace("uni", "&#x") + ";" for i in codeList]
# print(result)
思路:
获取到woff字体文件,保存到本地,然后同TTfont模块读取字体文件,pil模块保存为文本类型图片,最后用ocr识别图片。
参考:https://blog.csdn.net/weixin_43752839/article/details/98314821#commentBox
多谢大老
本代码里使用 百度文字识别接口,另;还可以用pytesseract模块来识别