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变量和字符串详解
Apr 29 Python
解决pandas 作图无法显示中文的问题
May 24 Python
Centos 升级到python3后pip 无法使用的解决方法
Jun 12 Python
Python使用pickle模块实现序列化功能示例
Jul 13 Python
Python实现的连接mssql数据库操作示例
Aug 17 Python
Python3.5迭代器与生成器用法实例分析
Apr 30 Python
用python3 返回鼠标位置的实现方法(带界面)
Jul 05 Python
基于django ManyToMany 使用的注意事项详解
Aug 09 Python
Python处理session的方法整理
Aug 29 Python
python 实现屏幕录制示例
Dec 23 Python
python selenium自动化测试框架搭建的方法步骤
Jun 14 Python
快速解决jupyter notebook启动需要密码的问题
Apr 21 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小马小结(方便查找后门的朋友)
2012/05/05 PHP
排序算法之PHP版快速排序、冒泡排序
2014/04/09 PHP
smarty实现多级分类的方法
2014/12/05 PHP
js表数据排序 sort table data
2009/02/18 Javascript
jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
2011/11/15 Javascript
datagrid框架的删除添加与修改
2013/04/08 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
2013/11/28 Javascript
js中的cookie的读写操作示例详解
2014/04/17 Javascript
jQuery学习笔记之jQuery构建函数的7种方法
2014/06/03 Javascript
javascript进行数组追加方法小结
2014/06/16 Javascript
javascript通过元素id和name直接取得元素的方法
2015/04/28 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
JS实现的简单标签点击切换功能示例
2017/09/21 Javascript
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
js Element Traversal规范中的元素遍历方法
2018/04/19 Javascript
浅谈Vue响应式(数组变异方法)
2018/05/07 Javascript
VUE预渲染及遇到的坑
2018/09/03 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
Python爬取三国演义的实现方法
2016/09/12 Python
Pandas 同元素多列去重的实例
2018/07/03 Python
python requests.post带head和body的实例
2019/01/02 Python
python 实现提取某个索引中某个时间段的数据方法
2019/02/01 Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
2019/08/09 Python
pytorch索引查找 index_select的例子
2019/08/18 Python
Python中Subprocess的不同函数解析
2019/12/10 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
2020/07/28 Python
澳洲的服装老品牌:SABA
2018/02/06 全球购物
老板电器官方购物商城:老板油烟机、燃气灶、消毒柜、电烤箱
2018/05/30 全球购物
铭宣海淘转运:美国、日本、英国转运等全球转运公司
2019/09/10 全球购物
数控技校生自我鉴定
2014/04/19 职场文书
党员个人剖析材料(四风问题)
2014/10/07 职场文书
新郎新娘致辞
2015/07/31 职场文书
广播稿:校园广播稿范文
2019/04/17 职场文书
python如何正确使用yield
2021/05/21 Python
25张裸眼3D图片,带你重温童年的记忆,感受3D的魅力
2022/02/06 杂记