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 01 Python
python MySQLdb Windows下安装教程及问题解决方法
May 09 Python
在Django的form中使用CSS进行设计的方法
Jul 18 Python
Python基础中所出现的异常报错总结
Nov 19 Python
TensorFlow实现简单卷积神经网络
May 24 Python
python re库的正则表达式入门学习教程
Mar 08 Python
使用python实现简单五子棋游戏
Jun 18 Python
Pandas删除数据的几种情况(小结)
Jun 21 Python
python爬虫之快速对js内容进行破解
Jul 09 Python
Python numpy.zero() 初始化矩阵实例
Nov 27 Python
python实现图片二值化及灰度处理方式
Dec 07 Python
virtualenv介绍及简明教程
Jun 23 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的cms
2010/12/19 PHP
如何使用php绘制在图片上的正余弦曲线
2013/06/08 PHP
php、java、android、ios通用的3des方法(推荐)
2016/09/09 PHP
php中请求url的五种方法总结
2017/07/13 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
php结合imgareaselect实现图片裁剪
2015/07/05 Javascript
jQuery多级手风琴菜单实例讲解
2015/10/22 Javascript
如何动态加载外部Javascript文件
2015/12/02 Javascript
Javascript随机标签云代码实例
2016/06/21 Javascript
Bootstrap 模态框实例插件案例分析
2016/12/28 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
2017/04/01 jQuery
使用jQuery,Angular实现登录界面验证码详解
2017/04/27 jQuery
bootstrap3中container与container_fluid外层容器的区别讲解
2017/12/04 Javascript
JavaScript实现二叉树定义、遍历及查找的方法详解
2017/12/20 Javascript
jQuery实现仿京东防抖动菜单效果示例
2018/07/06 jQuery
vue结合axios与后端进行ajax交互的方法
2018/07/06 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
vue实现绑定事件的方法实例代码详解
2019/06/20 Javascript
vue实现直播间点赞飘心效果的示例代码
2019/09/20 Javascript
python中使用pyhook实现键盘监控的例子
2014/07/18 Python
1分钟快速生成用于网页内容提取的xslt
2018/02/23 Python
Django 多环境配置详解
2019/05/14 Python
基于Python获取照片的GPS位置信息
2020/01/20 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
2020/06/11 Python
Pycharm自带Git实现版本管理的方法步骤
2020/09/18 Python
小结Python的反射机制
2020/09/28 Python
python 基于opencv 绘制图像轮廓
2020/12/11 Python
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
印度网上药店:1mg
2017/10/13 全球购物
泰国网上购物:Shopee泰国
2018/09/14 全球购物
Aurora London官网:奢华、负担得起的皮革手袋
2020/08/01 全球购物
学术会议欢迎词
2014/01/09 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书
服务整改报告
2014/11/06 职场文书
Go 语言下基于Redis分布式锁的实现方式
2021/06/28 Golang