Python使用freetype渲染显示阿拉伯语

目录
一、使用场景
二、语言背景
三、环境搭建
四、程序结构
五、代码

一、使用场景

公司一直以点阵屏显示为业务。最近希望替换原有的点阵字库,转用FreeType渲染矢量字形,且需要支持阿拉伯语。验证可行性阶段因为python的各种库用起来相当舒服,所以就先用Python进行验证,通过后再转C++实现。

二、语言背景

阿拉伯语与常规语言不同,它属于复杂文本语言。它有以下3个特点:
1.阅读顺序从右往左
2.字符在词前中后有不同写法
3.带有修饰符号
这里非常感谢建国雄心大哥的文章。推荐大家对于阿拉伯文如果不理解可以去他的博客看看。
http://blog.sina.com.cn/s/articlelist_1569506881_0_1.html

因为阿拉伯文有以上特点,所以不能单纯的一个字符一个字符的读取并渲染,在对字符串渲染之前需要经过一次特殊处理,转成正确的Unicode码串后再使用FreeTyoe对转换后的Unicode码串进行渲染。

三、环境搭建

这里需要用到3个Python库
1.numpy
引用原因:方便对点阵数组的操作, 而且Freetype好像也用到了
安装命令:pip install numpy
2.freetype-py
引用原因:矢量字体渲染模块
安装命令:pip install freetype-py
3.matplotlib
引用原因:显示渲染结果,如果需要在别的地方显示,可以不需要
安装命令:pip install matplotlib

四、程序结构

首先,对多语言的渲染大致分为两个模块,解析模块和渲染模块。解析模块用于处理原始Unicode码;渲染模块根据Unicode码取字模并合成点阵数组。
流程大致如下:原始字符串 -> 解析模块 -> 处理后Unicode码串 -> 渲染模块 -> 点阵数组 -> 显示。
这里的解析模块本人是自己写,但是推荐使用HarfBuzz。

这里放个用matplotlib显示的效果
在这里插入图片描述

五、 代码

解析模块

class ArabicText(object):
    # first, last, middle, alone   
    __arabic_Positions=[[ 0xfe80, 0xfe80, 0xfe80, 0xfe80],         #0x621
        [ 0xfe82, 0xfe81, 0xfe82, 0xfe81], 
        [ 0xfe84, 0xfe83, 0xfe84, 0xfe83],
        [ 0xfe86, 0xfe85, 0xfe86, 0xfe85],
        [ 0xfe88, 0xfe87, 0xfe88, 0xfe87],
        [ 0xfe8a, 0xfe8b, 0xfe8c, 0xfe89],    
        [ 0xfe8e, 0xfe8d, 0xfe8e, 0xfe8d],    
        [ 0xfe90, 0xfe91, 0xfe92, 0xfe8f],    
        [ 0xfe94, 0xfe93, 0xfe94, 0xfe93],    
        [ 0xfe96, 0xfe97, 0xfe98, 0xfe95],    
        [ 0xfe9a, 0xfe9b, 0xfe9c, 0xfe99],    
        [ 0xfe9e, 0xfe9f, 0xfea0, 0xfe9d],    
        [ 0xfea2, 0xfea3, 0xfea4, 0xfea1],    
        [ 0xfea6, 0xfea7, 0xfea8, 0xfea5],    
        [ 0xfeaa, 0xfea9, 0xfeaa, 0xfea9],    
        [ 0xfeac, 0xfeab, 0xfeac, 0xfeab],    
        [ 0xfeae, 0xfead, 0xfeae, 0xfead],    
        [ 0xfeb0, 0xfeaf, 0xfeb0, 0xfeaf],    
        [ 0xfeb2, 0xfeb3, 0xfeb4, 0xfeb1],    
        [ 0xfeb6, 0x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值