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 相关文章推荐
zbar解码二维码和条形码示例
Feb 07 Python
python用10行代码实现对黄色图片的检测功能
Aug 10 Python
Python实现的矩阵类实例
Aug 22 Python
为什么入门大数据选择Python而不是Java?
Mar 07 Python
Python数据分析库pandas基本操作方法
Apr 08 Python
Python常见数字运算操作实例小结
Mar 22 Python
Python3模拟curl发送post请求操作示例
May 03 Python
解决Python3 抓取微信账单信息问题
Jul 19 Python
numpy.meshgrid()理解(小结)
Aug 01 Python
pycharm 更改创建文件默认路径的操作
Feb 15 Python
利用python爬取有道词典的方法
Dec 08 Python
python flappy bird小游戏分步实现流程
Feb 15 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中var_export与var_dump的区别分析
2010/08/21 PHP
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
jQuery Ajax请求状态管理器打包
2012/05/03 Javascript
Javascript实现禁止输入中文或英文的例子
2014/12/09 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
2015/01/28 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
2015/02/24 Javascript
jQuery实现垂直半透明手风琴特效代码分享
2015/08/21 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
Javascript 链式作用域详细介绍
2017/02/23 Javascript
Vue登录注册并保持登录状态的方法
2018/08/17 Javascript
ES6中let 和 const 的新特性
2018/09/03 Javascript
js对象简介与基本用法示例
2020/03/13 Javascript
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
详解python的几种标准输出重定向方式
2016/08/15 Python
Python装饰器实现几类验证功能做法实例
2017/05/18 Python
Python金融数据可视化汇总
2017/11/17 Python
Selenium 模拟浏览器动态加载页面的实现方法
2018/05/16 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
django foreignkey外键使用的例子 相当于left join
2019/08/06 Python
python内置函数sorted()用法深入分析
2019/10/08 Python
详解python tcp编程
2020/08/24 Python
使用BeautifulSoup4解析XML的方法小结
2020/12/07 Python
Python机器学习工具scikit-learn的使用笔记
2021/01/28 Python
CSS3按钮鼠标悬浮实现光圈效果源码
2016/09/11 HTML / CSS
Banana Republic欧盟:美国都市简约风格的代表品牌
2018/05/09 全球购物
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
英国领先的在线高尔夫商店:Scottsdale Golf
2019/08/26 全球购物
英语专业毕业个人求职自荐信
2013/09/21 职场文书
现金会计岗位职责
2013/12/05 职场文书
幼儿园家长会欢迎词
2014/01/09 职场文书
社区道德讲堂实施方案
2014/03/21 职场文书
教师节促销方案
2014/03/22 职场文书
农业开发项目建议书
2014/05/16 职场文书
2015年检验科工作总结
2015/04/27 职场文书
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电