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实现的登陆Discuz!论坛通用代码分享
Jul 11 Python
python处理csv数据的方法
Mar 11 Python
在Django的视图中使用数据库查询的方法
Jul 16 Python
python3读取MySQL-Front的MYSQL密码
May 03 Python
python基础while循环及if判断的实例讲解
Aug 25 Python
python使用jieba实现中文分词去停用词方法示例
Mar 11 Python
Python 通过打码平台实现验证码的实现
May 13 Python
Python求两点之间的直线距离(2种实现方法)
Jul 07 Python
python通过TimedRotatingFileHandler按时间切割日志
Jul 17 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
Aug 13 Python
selenium 多窗口切换的实现(windows)
Jan 18 Python
Python list列表删除元素的4种方法
Nov 01 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 empty函数判断mysql表单是否为空
2010/04/12 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
PHP实现简单的模板引擎功能示例
2017/09/02 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
JavaScript 模式之工厂模式(Factory)应用介绍
2012/11/15 Javascript
JS和JQ的event对象区别分析
2014/11/24 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
jQuery实现定时读取分析xml文件的方法
2015/07/16 Javascript
javascript的BOM汇总
2015/07/16 Javascript
javascript实现tab切换的四种方法
2015/11/05 Javascript
js阻止浏览器默认行为触发的通用方法(推荐)
2016/05/15 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
JavaScript实战之带收放动画效果的导航菜单
2016/08/16 Javascript
JS判断是否在微信浏览器打开的简单实例(推荐)
2016/08/24 Javascript
JavaScript模板引擎Template.js使用详解
2016/12/15 Javascript
基于模板引擎Jade的应用(详解)
2017/12/12 Javascript
JS实现面向对象继承的5种方式分析
2018/07/21 Javascript
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
小程序如何获取多个formId实现详解
2019/09/20 Javascript
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
Python内置函数OCT详解
2016/11/09 Python
Python单例模式实例详解
2017/03/01 Python
python 魔法函数实例及解析
2019/09/25 Python
Python实现线性插值和三次样条插值的示例代码
2019/11/13 Python
HTML5+CSS3模仿优酷视频截图功能示例
2017/01/05 HTML / CSS
美国创意之家:BulbHead
2017/07/12 全球购物
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
英国优质家居用品网上品牌:URBANARA
2018/06/01 全球购物
中国跨镜手机配件批发在线商店:TVC-Mall
2019/08/20 全球购物
VICHY薇姿俄罗斯官方网上商店:法国护肤品牌,火山温泉水
2019/11/22 全球购物
英语专业大学生求职简历的自我评价
2013/10/18 职场文书
诚信承诺书范文
2014/03/27 职场文书
解除劳动合同协议书范本
2014/09/13 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书