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编写一个简单的俄罗斯方块游戏的教程
Apr 03 Python
学习python 之编写简单乘法运算题
Feb 27 Python
Python 模块EasyGui详细介绍
Feb 19 Python
python 中random模块的常用方法总结
Jul 08 Python
Python实现接受任意个数参数的函数方法
Apr 21 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
May 15 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
May 19 Python
pandas筛选某列出现编码错误的解决方法
Nov 07 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
May 16 Python
python文件操作的简单方法总结
Nov 07 Python
python3实现用turtle模块画一棵随机樱花树
Nov 21 Python
Python xmltodict模块安装及代码实例
Oct 05 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中根据变量的类型 选择echo或dump
2012/07/05 PHP
thinkphp的c方法使用示例
2014/02/24 PHP
PHP学习记录之数组函数
2018/06/01 PHP
关于文本框的一些限制控制总结~~
2010/04/15 Javascript
js中将字符串转换成json的三种方式
2011/01/12 Javascript
jquery 实现表单验证功能代码(简洁)
2012/07/03 Javascript
Jquery显示、隐藏元素以及添加删除样式
2013/08/09 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
2014/08/18 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
JavaScript实现列出数组中最长的连续数
2014/12/29 Javascript
JavaScript实现把数字转换成中文
2015/06/29 Javascript
JavaScript实现节点的删除与序号重建实例
2015/08/05 Javascript
深入理解JQuery循环绑定事件
2016/06/02 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
vue实现列表的添加点击
2016/12/29 Javascript
jQuery条件分页 代替离线查询(附代码)
2017/08/17 jQuery
Puppet的一些技巧
2018/09/17 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
Flask框架的学习指南之用户登录管理
2016/11/20 Python
Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例
2019/01/23 Python
关于pytorch中网络loss传播和参数更新的理解
2019/08/20 Python
Python任务调度模块APScheduler使用
2020/04/15 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
基于python爬取链家二手房信息代码示例
2020/10/21 Python
python openpyxl模块的使用详解
2021/02/25 Python
SmartBuyGlasses丹麦:网上购买名牌太阳镜、眼镜和隐形眼镜
2016/10/01 全球购物
Windows和Linux动态库应用异同
2016/04/17 面试题
Linux内核的同步机制是什么?主要有哪几种内核锁
2013/01/03 面试题
报纸媒体创意广告词
2014/03/17 职场文书
诚信考试承诺书
2014/03/27 职场文书
优秀班主任经验交流材料
2014/06/02 职场文书
农村党支部书记党群众路线四风问题整改措施
2014/09/26 职场文书
2014教师年度工作总结
2014/11/10 职场文书
保险公司2016开门红口号集锦
2015/12/24 职场文书
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python