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的闭包和装饰器
Feb 26 Python
Python守护进程和脚本单例运行详解
Jan 06 Python
Python批量发送post请求的实现代码
May 05 Python
Python中整数的缓存机制讲解
Feb 16 Python
详解python--模拟轮盘抽奖游戏
Apr 12 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
Jan 19 Python
基于Python脚本实现邮件报警功能
May 20 Python
Python实现弹球小游戏
Aug 01 Python
Pytest测试框架基本使用方法详解
Nov 25 Python
python 录制系统声音的示例
Dec 21 Python
健身房被搭讪?用python写了个小米计时器助人为乐
Jun 08 Python
numpy array找出符合条件的数并赋值的示例代码
Jun 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
DISCUZ 论坛管理员密码忘记的解决方法
2009/05/14 PHP
PHP以及MYSQL日期比较方法
2012/11/29 PHP
PHP中Trait及其应用详解
2017/02/14 PHP
PHP从尾到头打印链表实例讲解
2018/09/27 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
2019/10/12 PHP
HR vs CL BO3 第二场 2.13
2021/03/10 DOTA
event.srcElement 用法笔记e.target
2009/12/18 Javascript
JS按字节截取字符长度实例
2013/11/20 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
2015/03/02 Javascript
javascript单例模式的简单实现方法
2015/07/25 Javascript
jQuery实现的Div窗口震动效果实例
2015/08/07 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
2015/08/31 Javascript
浅谈jQuery中ajaxPrefilter的应用
2016/08/01 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
2017/03/07 Javascript
Node.js 回调函数实例详解
2017/07/06 Javascript
sublime text配置node.js调试(图文教程)
2017/11/23 Javascript
HTML5+JS+JQuery+ECharts实现异步加载问题
2017/12/16 jQuery
vuex提交state&&实时监听state数据的改变方法
2018/09/16 Javascript
在layui中select更改后生效的方法
2019/09/05 Javascript
python 文件和路径操作函数小结
2009/11/23 Python
python插入排序算法实例分析
2015/07/03 Python
详解Python3中字符串中的数字提取方法
2017/01/14 Python
Python实现的选择排序算法示例
2017/11/29 Python
Python unittest 简单实现参数化的方法
2018/11/30 Python
python实现nao机器人身体躯干和腿部动作操作
2019/04/29 Python
Python 3 实现定义跨模块的全局变量和使用教程
2019/07/07 Python
分享一个pycharm专业版安装的永久使用方法
2019/09/24 Python
Django REST framwork的权限验证实例
2020/04/02 Python
详解基于Scrapy的IP代理池搭建
2020/09/29 Python
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
Charles & Colvard官网:美国莫桑石品牌
2019/06/05 全球购物
创业计划书的写作技巧及要点
2014/01/31 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
董事长开业致辞
2015/07/29 职场文书
使用@Value值注入及配置文件组件扫描
2021/07/09 Java/Android