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的pyxmpp2中的主循环使其提高性能
Apr 24 Python
Python基于scapy实现修改IP发送请求的方法示例
Jul 08 Python
python方向键控制上下左右代码
Jan 20 Python
Python第三方Window模块文件的几种安装方法
Nov 22 Python
Python3转换html到pdf的不同解决方案
Mar 11 Python
pycharm修改文件的默认打开方式的步骤
Jul 29 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
Sep 04 Python
python redis 批量设置过期key过程解析
Nov 26 Python
python进行参数传递的方法
May 12 Python
python 在sql语句中使用%s,%d,%f说明
Jun 06 Python
python机器学习创建基于规则聊天机器人过程示例详解
Nov 02 Python
7个关于Python的经典基础案例
Nov 07 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
简单的页面缓冲技术
2006/10/09 PHP
php学习笔记 PHP面向对象的程序设计
2011/06/13 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
2016/10/29 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
2013/11/25 Javascript
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
Javascript玩转继承(二)
2014/05/08 Javascript
javascipt:filter过滤介绍及使用
2014/09/10 Javascript
jQuery中each()方法用法实例
2014/12/27 Javascript
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
jQuery通过扩展实现抖动效果的方法
2015/03/11 Javascript
浅谈JavaScript的Polymer框架中的事件绑定
2015/07/29 Javascript
BootStrap Validator 版本差异问题导致的submitHandler失效问题的解决方法
2016/12/01 Javascript
解析如何利用iframe标签以及js制作时钟
2016/12/08 Javascript
JS实现分页浏览横向图片(类轮播)实例代码
2017/11/06 Javascript
详解ES6中的 Set Map 数据结构学习总结
2018/11/06 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
[38:27]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第二场 11.26
2020/11/30 DOTA
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
在Docker上部署Python的Flask框架的教程
2015/04/08 Python
详解Swift中属性的声明与作用
2016/06/30 Python
用python处理MS Word的实例讲解
2018/05/08 Python
Pycharm导入Python包,模块的图文教程
2018/06/13 Python
Python OpenCV图像指定区域裁剪的实现
2019/10/30 Python
Flask处理Web表单的实现方法
2021/01/31 Python
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
掌上明珠Java程序员面试总结
2016/02/23 面试题
幼师自我鉴定范文
2013/10/01 职场文书
拒绝黄毒毒宣传标语
2014/06/26 职场文书
学校教师安全责任书
2014/07/23 职场文书
离职证明范本(5篇)
2014/09/19 职场文书
大学运动会加油稿200字(5篇)
2014/09/27 职场文书
九年级数学教学反思
2016/02/17 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers