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 正则式 概述及常用字符
May 07 Python
Python线程中对join方法的运用的教程
Apr 09 Python
python字典get()方法用法分析
Apr 17 Python
Python实现爬取逐浪小说的方法
Jul 07 Python
用ReactJS和Python的Flask框架编写留言板的代码示例
Dec 19 Python
详解python中的json的基本使用方法
Dec 21 Python
对python 匹配字符串开头和结尾的方法详解
Oct 27 Python
pycharm new project变成灰色的解决方法
Jun 27 Python
浅谈Django+Gunicorn+Nginx部署之路
Sep 11 Python
基于Python中isfile函数和isdir函数使用详解
Nov 29 Python
Python中OpenCV实现查找轮廓的实例
Jun 08 Python
python使用PySimpleGUI设置进度条及控件使用
Jun 10 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
一个oracle+PHP的查询的例子
2006/10/09 PHP
php模拟asp中的XmlHttpRequest实现http请求的代码
2011/03/24 PHP
php 5.6版本中编写一个PHP扩展的简单示例
2015/01/20 PHP
PHP CURL 内存泄露问题解决方法
2015/02/12 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
2015/12/09 PHP
PHP简单实现文本计数器的方法
2016/04/28 PHP
PHP的mysqli_set_charset()函数讲解
2019/01/23 PHP
jQuery 1.8 Release版本发布了
2012/08/14 Javascript
Jquery实现视频播放页面的关灯开灯效果
2013/05/27 Javascript
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
jQuery打印图片pdf、txt示例代码
2014/07/22 Javascript
javascript数组详解
2014/10/22 Javascript
javascript实现rgb颜色转换成16进制格式
2015/07/10 Javascript
jQuery实现页面顶部显示的进度条效果完整实例
2015/12/09 Javascript
你一定会收藏的Nodejs代码片段
2016/02/04 NodeJs
js实现PC端根据IP定位当前城市地理位置
2017/02/22 Javascript
Vue使用vue-cli创建项目
2017/09/01 Javascript
Angular整合zTree的示例代码
2018/01/24 Javascript
详解vuex的简单使用
2018/03/12 Javascript
vue双向绑定及观察者模式详解
2019/03/19 Javascript
JavaScript实现页面中录音功能的方法
2019/06/04 Javascript
python制作爬虫并将抓取结果保存到excel中
2016/04/06 Python
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
python遍历文件夹找出文件夹后缀为py的文件方法
2018/10/21 Python
Python lxml解析HTML并用xpath获取元素的方法
2019/01/02 Python
python函数的作用域及关键字详解
2019/08/20 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
Python并发爬虫常用实现方法解析
2020/11/19 Python
美国马匹用品和骑马配件购物网站:Horse.com
2018/01/08 全球购物
电子商务专业学生的学习自我评价
2013/10/27 职场文书
高中毕业自我鉴定
2013/12/13 职场文书
后勤采购员岗位职责
2013/12/19 职场文书
企业管理毕业生求职信范文
2014/03/07 职场文书
卖房协议书
2014/04/11 职场文书
《学棋》教后反思
2014/04/14 职场文书
户外活动总结范文
2014/04/30 职场文书