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赋值操作方法分享
Mar 23 Python
Python实现获取网站PR及百度权重
Jan 21 Python
KMP算法精解及其Python版的代码示例
Jun 01 Python
Python字典简介以及用法详解
Nov 15 Python
Python回文字符串及回文数字判定功能示例
Mar 20 Python
python移位运算的实现
Jul 15 Python
详解python列表(list)的使用技巧及高级操作
Aug 15 Python
python实现多进程通信实例分析
Sep 01 Python
关于Python内存分配时的小秘密分享
Sep 05 Python
python实现俄罗斯方块游戏(改进版)
Mar 13 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
Apr 11 Python
python 统计代码耗时的几种方法分享
Apr 02 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中的静态变量及static静态变量使用详解
2015/11/05 PHP
JQueryEasyUI datagrid框架的进阶使用
2013/04/08 Javascript
Ajax异步提交表单数据的说明及方法实例
2013/06/22 Javascript
jquery中validate与form插件提交的方式小结
2016/03/26 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
2016/06/09 Javascript
Bootstrap Table使用方法详解
2016/08/01 Javascript
利用Javascript实现BMI计算器
2016/08/16 Javascript
类似于QQ的右滑删除效果的实现方法
2016/10/16 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
jquery插件canvaspercent.js实现百分比圆饼效果
2017/07/18 jQuery
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
react-native动态切换tab组件的方法
2018/07/07 Javascript
记React connect的几种写法(小结)
2018/09/18 Javascript
js replace替换字符串同时替换多个方法
2018/11/27 Javascript
通过vue手动封装on、emit、off的代码详解
2019/05/29 Javascript
Vue 刷新当前路由的实现代码
2019/09/26 Javascript
vue中使用rem布局代码详解
2019/10/30 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
python操作xml文件示例
2014/04/07 Python
Python中操作文件之write()方法的使用教程
2015/05/25 Python
Python实现识别手写数字大纲
2018/01/29 Python
浅谈Python的list中的选取范围
2018/11/12 Python
django连接oracle时setting 配置方法
2019/08/29 Python
python rolling regression. 使用 Python 实现滚动回归操作
2020/06/08 Python
tensorflow之读取jpg图像长和宽实例
2020/06/18 Python
美国领先的水果篮送货公司和新鲜水果供应商:The Fruit Company
2018/02/13 全球购物
餐厅总经理岗位职责
2013/12/31 职场文书
办理暂住证介绍信
2014/01/11 职场文书
优秀体育委员自荐书
2014/01/31 职场文书
会计学自我鉴定
2014/02/06 职场文书
师范大学生求职信
2014/06/13 职场文书
给校长的一封检讨书
2014/09/20 职场文书
安全生产月宣传标语
2014/10/06 职场文书
2015年毕业实习工作总结
2014/12/12 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
AJAX实现指定部分页面刷新效果
2021/10/16 Javascript