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 相关文章推荐
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
Mar 30 Python
Python中使用partial改变方法默认参数实例
Apr 28 Python
详解Python的Django框架中的模版继承
Jul 16 Python
python opencv实现任意角度的透视变换实例代码
Jan 12 Python
python使用Turtle库绘制动态钟表
Nov 19 Python
Python对excel文档的操作方法详解
Dec 10 Python
python创造虚拟环境方法总结
Mar 04 Python
简单了解python关系(比较)运算符
Jul 08 Python
python开头的coding设置方法
Aug 08 Python
python对XML文件的操作实现代码
Mar 27 Python
python实现学生成绩测评系统
Jun 22 Python
python opencv人脸识别考勤系统的完整源码
Apr 26 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作的文本留言本的例子(五)
2006/10/09 PHP
PHP添加MySQL数据记录代码
2008/06/07 PHP
简单的cookie计数器实现源码
2013/06/07 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
js脚本学习 比较实用的基础
2006/09/07 Javascript
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
2013/05/07 Javascript
解决jquery插件冲突的问题
2014/01/23 Javascript
js数组中如何随机取出一个值
2014/06/13 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
2016/04/07 Javascript
vue.js表格分页示例
2016/10/18 Javascript
echarts设置图例颜色和地图底色的方法实例
2018/08/01 Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
2018/09/21 Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
2019/08/27 jQuery
javascript canvas实现简易时钟例子
2020/09/05 Javascript
学习python之编写简单乘法口诀表实现代码
2016/02/27 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
2018/06/11 Python
python3正则提取字符串里的中文实例
2019/01/31 Python
Python3将数据保存为txt文件的方法
2019/09/12 Python
手把手教你安装Windows版本的Tensorflow
2020/03/26 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
使用matplotlib动态刷新指定曲线实例
2020/04/23 Python
python求解汉诺塔游戏
2020/07/09 Python
Python将字典转换为XML的方法
2020/08/01 Python
python绘制分布折线图的示例
2020/09/24 Python
Python 删除List元素的三种方法remove、pop、del
2020/11/16 Python
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
美国排名第一的泳池用品直接来源:In The Swim
2019/09/23 全球购物
"火柴棍式"程序员面试题
2014/03/16 面试题
如何写好升职自荐信
2014/01/06 职场文书
员工薪酬福利制度
2014/01/17 职场文书
医药学专业大学生职业生涯规划书论文
2014/01/21 职场文书
培训协议书范本
2014/04/22 职场文书
ktv筹备计划书
2014/05/03 职场文书
大一工商管理职业生涯规划:有梦最美,行动相随
2014/09/18 职场文书
MySQL实战记录之如何快速定位慢SQL
2022/03/23 MySQL