Python实现点阵字体读取与转换的方法


Posted in Python onJanuary 29, 2019

点阵字体是指根据文字的像素点来显示的字体,效果如下:

Python实现点阵字体读取与转换的方法

使用Python读取并显示的过程如下:

根据中文字符获取GB2312编码

通过GB2312编码计算该汉字在点阵字库中的区位和码位

通过区位和码位计算在点阵字库中的偏移量

基于偏移量获取该汉字的32个像素存储字节

解析像素字节获取点阵坐标信息

在对应的坐标显示信息位。如该像素点是否显示点亮

使用该代码前提:下载点阵字体库到本地,这里默认使用的是hzk16点阵字库

代码如下:

#!/usr/bin/python
#encoding: utf-8
import binascii
 
RECT_HEIGHT = 16
RECT_WIDTH = 16
BYTE_COUNT_PER_ROW = RECT_WIDTH / 8
BYTE_COUNT_PER_FONT = BYTE_COUNT_PER_ROW * RECT_HEIGHT
 
KEYS = [0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01]
 
class FontRender(object):
 def __init__(self, font_file,
  rect_height=RECT_HEIGHT, rect_width=RECT_WIDTH, byte_count_per_row=BYTE_COUNT_PER_ROW):
 self.font_file = font_file
 self.rect_height = rect_height
 self.rect_width = rect_width
 self.byte_count_per_row = byte_count_per_row
 
 self.__init_rect_list__()
 
 def __init_rect_list__(self):
 self.rect_list = [] * RECT_HEIGHT
 
 for i in range(RECT_HEIGHT):
 self.rect_list.append([] * RECT_WIDTH)
 
 def get_font_area_index(self, txt, encoding='utf-8'):
 if not isinstance(txt, unicode):
 txt = txt.decode(encoding)
 
 gb2312 = txt.encode('gb2312')
 hex_str = binascii.b2a_hex(gb2312)
 
 area = eval('0x' + hex_str[:2]) - 0xA0
 index = eval('0x' + hex_str[2:]) - 0xA0
 
 return area, index
 
 def get_font_rect(self, area, index):
 offset = (94 * (area-1) + (index-1)) * BYTE_COUNT_PER_FONT
 btxt = None
 
 with open(self.font_file, "rb") as f:
 f.seek(offset)
 btxt = f.read(BYTE_COUNT_PER_FONT)
 
 return btxt
 
 def convert_font_rect(self, font_rect, ft=1, ff=0):
 for k in range(len(font_rect) / self.byte_count_per_row):
 row_list = self.rect_list[k]
 for j in range(self.byte_count_per_row):
 for i in range(8):
  asc = binascii.b2a_hex(font_rect[k * self.byte_count_per_row + j])
  asc = eval('0x' + asc)
  flag = asc & KEYS[i]
  row_list.append(flag and ft or ff)
 
 def render_font_rect(self, rect_list=None):
 if not rect_list:
 rect_list = self.rect_list
 
 for row in rect_list:
 for i in row:
 if i:
  print '■',
 else:
  print '○',
 print
 
 def convert(self, text, ft=None, ff=None, encoding='utf-8'):
 if not isinstance(text, unicode):
 text = text.decode(encoding)
 
 for t in text:
 area, index = self.get_font_area_index(t)
 font_rect = self.get_font_rect(area, index)
 
 self.convert_font_rect(font_rect, ft=ft, ff=ff)
 
 def get_rect_info(self):
 return self.rect_list
 
if '__main__' == __name__:
 text = u'同创伟业'
 fr = FontRender('./font/16x16/hzk16h')
 fr.convert(text, ft='/static/*', ff=0)
 # print fr.get_rect_info()
 fr.render_font_rect()

以上这篇Python实现点阵字体读取与转换的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 示例分享---逻辑推理编程解决八皇后
Jul 20 Python
Python自动连接ssh的方法
Mar 07 Python
Python编程实现二分法和牛顿迭代法求平方根代码
Dec 04 Python
pandas数据预处理之dataframe的groupby操作方法
Apr 13 Python
Python 数据处理库 pandas进阶教程
Apr 21 Python
Python3使用turtle绘制超立方体图形示例
Jun 19 Python
Python退火算法在高次方程的应用
Jul 26 Python
Python清空文件并替换内容的实例
Oct 22 Python
解决python ogr shp字段写入中文乱码的问题
Dec 31 Python
利用selenium爬虫抓取数据的基础教程
Jun 10 Python
基于Django signals 信号作用及用法详解
Mar 28 Python
Python常用模块函数代码汇总解析
Aug 31 Python
使用python读取.text文件特定行的数据方法
Jan 28 #Python
python 实现一次性在文件中写入多行的方法
Jan 28 #Python
用Python逐行分析文件方法
Jan 28 #Python
Python使用Shelve保存对象方法总结
Jan 28 #Python
Python理解递归的方法总结
Jan 28 #Python
代码详解django中数据库设置
Jan 28 #Python
Python控制键盘鼠标pynput的详细用法
Jan 28 #Python
You might like
php htmlspecialchars()与shtmlspecialchars()函数的深入分析
2013/06/05 PHP
ThinkPHP使用心得分享-上传类UploadFile的使用
2014/05/15 PHP
一段好玩的JavaScript代码
2006/12/01 Javascript
jQuery jqgrid 对含特殊字符json 数据的 Java 处理方法
2011/01/01 Javascript
避免回车键导致的页面无意义刷新的解决方法
2011/04/12 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
JavaScript中的原型链prototype介绍
2014/12/30 Javascript
NodeJS学习笔记之(Url,QueryString,Path)模块
2015/01/13 NodeJs
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
2015/03/12 Javascript
基于JavaScript实现表单密码的隐藏和显示出来
2016/03/02 Javascript
JS获取屏幕高度的简单实现代码
2016/05/24 Javascript
原生js实现类似fullpage的单页/全屏滚动
2017/01/22 Javascript
ajax接收后台数据在html页面显示
2017/02/19 Javascript
js实现音频控制进度条功能
2017/04/01 Javascript
JavaScript实现为事件句柄绑定监听函数的方法分析
2017/11/14 Javascript
JavaScript重复元素处理方法分析【统计个数、计算、去重复等】
2017/12/14 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
2018/11/22 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
JavaScript 处理树数据结构的方法示例
2019/06/16 Javascript
小程序分页实践之编写可复用分页组件
2019/07/18 Javascript
JS实现音量控制拖动
2020/01/15 Javascript
javascript 内存模型实例详解
2020/04/18 Javascript
JavaScript实现移动端拖动元素
2020/11/24 Javascript
[01:28:43]2014 DOTA2华西杯精英邀请赛5 24 DK VS CIS
2014/05/25 DOTA
[53:20]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 VG vs OG
2018/04/03 DOTA
python绘图方法实例入门
2015/05/19 Python
python numpy格式化打印的实例
2018/05/14 Python
Python绘制正余弦函数图像的方法
2018/08/28 Python
意大利婴儿产品网上商店:Mukako
2018/10/14 全球购物
什么是事务?为什么需要事务?
2012/01/09 面试题
UNIX操作系统结构由哪几部分组成
2016/02/17 面试题
公关关系专员的自我评价分享
2013/11/20 职场文书
数学国培研修感言
2014/02/13 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书
2019终止劳动合同协议书最新范本!
2019/07/09 职场文书
Java面试题冲刺第十九天--数据库(4)
2021/08/07 Java/Android