自定义字体文件解析成人眼可识别文字

# 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模块来识别

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

坦桑尼亚奥杜威峡谷能人

感谢您的认可

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

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

打赏作者

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

抵扣说明:

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

余额充值