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+微信接口实现运维报警
Aug 27 Python
python 异常处理总结
Oct 18 Python
轻松掌握python设计模式之策略模式
Nov 18 Python
python如何读写json数据
Mar 21 Python
python 列表降维的实例讲解
Jun 28 Python
django模板加载静态文件的方法步骤
Mar 01 Python
Scrapy-Redis结合POST请求获取数据的方法示例
May 07 Python
python全栈知识点总结
Jul 01 Python
用django设置session过期时间的方法解析
Aug 05 Python
Django如何实现网站注册用户邮箱验证功能
Aug 14 Python
Python接口测试文件上传实例解析
May 22 Python
利用Python的folium包绘制城市道路图的实现示例
Aug 24 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网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
PHP缓冲区用法总结
2016/02/14 PHP
jQuery lazyload 的重复加载错误以及修复方法
2010/11/19 Javascript
16个最流行的JavaScript框架[推荐]
2011/05/29 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
2015/09/06 Javascript
分享10个优化代码的CSS和JavaScript工具
2016/05/11 Javascript
一个极为简单的requirejs实现方法
2016/10/20 Javascript
jQuery.datatables.js插件用法及api实例详解
2016/10/28 Javascript
正则表达式替换html元素属性的方法
2016/11/26 Javascript
JavaScript实现经典排序算法之冒泡排序
2016/12/28 Javascript
详解Vue2.x-directive的学习笔记
2017/07/17 Javascript
给vue项目添加ESLint的详细步骤
2017/09/29 Javascript
vue中的计算属性的使用和vue实例的方法示例
2017/12/04 Javascript
Nuxt.js 数据双向绑定的实现
2019/02/17 Javascript
js实现全选反选不选功能代码详解
2019/04/24 Javascript
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
2019/05/09 Javascript
layui异步加载table表中某一列数据的例子
2019/09/16 Javascript
Vue实现简单计算器案例
2020/02/25 Javascript
[05:06]2017亚洲邀请赛DAC回顾片
2017/04/19 DOTA
Python实现获取网站PR及百度权重
2015/01/21 Python
python基础教程项目四之新闻聚合
2018/04/02 Python
python批量修改文件编码格式的方法
2018/05/31 Python
Python判断telnet通不通的实例
2019/01/26 Python
pycharm新建一个python工程步骤
2019/07/16 Python
python 如何去除字符串头尾的多余符号
2019/11/19 Python
基于python实现数组格式参数加密计算
2020/04/21 Python
使用Html5、CSS实现文字阴影效果
2018/01/17 HTML / CSS
优秀实习生感言
2014/03/01 职场文书
地理信息科学专业推荐信
2014/09/08 职场文书
2015羊年春节慰问信
2015/02/14 职场文书
教师节慰问信
2015/02/15 职场文书
《确定位置》教学反思
2016/02/18 职场文书
利用Python+OpenCV三步去除水印
2021/05/28 Python