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定时检查启动某个exe程序适合检测exe是否挂了
Jan 21 Python
Python yield使用方法示例
Dec 04 Python
一个基于flask的web应用诞生 用户注册功能开发(5)
Apr 11 Python
视觉直观感受若干常用排序算法
Apr 13 Python
详解用python实现简单的遗传算法
Jan 02 Python
Pycharm 设置自定义背景颜色的图文教程
May 23 Python
python操作mysql代码总结
Jun 01 Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
Jun 04 Python
pyqt 实现为长内容添加滑轮 scrollArea
Jun 19 Python
linux环境下Django的安装配置详解
Jul 22 Python
Python 导入文件过程图解
Oct 15 Python
在matplotlib中改变figure的布局和大小实例
Apr 23 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
cache_lite试用
2007/02/14 PHP
PHP版自动生成文章摘要
2008/07/23 PHP
linux iconv方法的使用
2011/10/01 PHP
php计算十二星座的函数代码
2012/08/21 PHP
php多文件上传下载示例分享
2014/02/20 PHP
php生成图片验证码的实例讲解
2015/08/03 PHP
php简单截取字符串代码示例
2016/10/19 PHP
php中namespace及use用法分析
2016/12/06 PHP
php 类中的常量、静态属性、非静态属性的区别
2017/04/09 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
20个最新的jQuery插件
2012/01/13 Javascript
Javascript继承(上)——对象构建介绍
2012/11/08 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
2014/11/26 Javascript
高性能JavaScript DOM编程(1)
2015/08/11 Javascript
jQuery链式操作实例分析
2015/11/16 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
Extjs实现下拉菜单效果
2016/04/01 Javascript
vue实现app页面切换动画效果实例
2017/05/23 Javascript
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
JavaScript用二分法查找数据的实例代码
2017/06/17 Javascript
angularjs2中父子组件的数据传递的实例代码
2017/07/05 Javascript
nodejs更改项目端口号的方法
2018/05/13 NodeJs
checkbox在vue中的用法小结
2018/11/13 Javascript
React组件对子组件children进行加强的方法
2019/06/23 Javascript
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
django基于restframework的CBV封装详解
2019/08/08 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
2020/04/08 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
2020/11/27 Python
Python try except else使用详解
2021/01/12 Python
英语专业毕业个人求职自荐信
2013/09/21 职场文书
九年级家长会邀请函
2014/01/15 职场文书
多媒体编辑专业毕业生求职信
2014/06/13 职场文书
2015年度班主任自我评价
2015/03/11 职场文书
排查Tomcat进程假死的问题
2022/05/06 Servers