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模块顶层运行的代码引起的一个Bug
Jul 04 Python
在Python的setuptools框架下生成egg的教程
Apr 13 Python
pygame实现弹力球及其变速效果
Jul 03 Python
对python requests的content和text方法的区别详解
Oct 11 Python
Python使用sorted对字典的key或value排序
Nov 15 Python
python 获取sqlite3数据库的表名和表字段名的实例
Jul 17 Python
python智联招聘爬虫并导入到excel代码实例
Sep 09 Python
Python模块的定义,模块的导入,__name__用法实例分析
Jan 07 Python
使用keras内置的模型进行图片预测实例
Jun 17 Python
Python3实现建造者模式的示例代码
Jun 28 Python
Python批量修改xml的坐标值全部转为整数的实例代码
Nov 26 Python
python 解决函数返回return的问题
Dec 05 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 MYSQL中插入当前时间
2008/04/06 PHP
PHP实现二维数组中的查找算法小结
2018/06/09 PHP
jQuery实现购物车多物品数量的加减+总价计算
2014/06/06 Javascript
jQuery实现6位数字密码输入框
2016/12/29 Javascript
微信小程序 Tab页切换更新数据
2017/01/05 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
JavaScript字符串对象
2017/01/14 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
javascript json字符串到json对象转义问题
2019/01/22 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
用Nodejs实现在终端中炒股的实现
2020/10/18 NodeJs
React服务端渲染原理解析与实践
2021/03/04 Javascript
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
python操作日期和时间的方法
2014/03/11 Python
wxpython中利用线程防止假死的实现方法
2014/08/11 Python
Python和C/C++交互的几种方法总结
2017/05/11 Python
Pandas中把dataframe转成array的方法
2018/04/13 Python
Flask框架学习笔记之模板操作实例详解
2019/08/15 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
python如何将图片转换素描画
2020/09/08 Python
Python grpc超时机制代码示例
2020/09/14 Python
小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码
2020/09/25 Python
python中的对数log函数表示及用法
2020/12/09 Python
Python字符串的15个基本操作(小结)
2021/02/03 Python
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
HTML5和CSS3实例教程总结(推荐)
2016/07/18 HTML / CSS
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
运行时异常与一般异常有何异同?
2014/01/05 面试题
七一党建活动方案
2014/01/28 职场文书
学校消防演习方案
2014/02/19 职场文书
给全校老师的建议书
2014/03/13 职场文书
三国演义读书笔记
2015/06/25 职场文书
2019银行竞聘书
2019/06/21 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书
PHP实现考试倒计时功能代码
2021/04/16 PHP
Windows server 2003卸载和安装IIS的图文教程
2022/07/15 Servers