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缩进区别分析
Feb 15 Python
python实现查询IP地址所在地
Mar 29 Python
在主机商的共享服务器上部署Django站点的方法
Jul 22 Python
深入解析Python中的集合类型操作符
Aug 19 Python
10 分钟快速入门 Python3的教程
Jan 29 Python
Django logging配置及使用详解
Jul 23 Python
python requests使用socks5的例子
Jul 25 Python
Jupyter notebook无法导入第三方模块的解决方式
Apr 15 Python
使用Python将语音转换为文本的方法
Aug 10 Python
Python configparser模块应用过程解析
Aug 14 Python
python七种方法判断字符串是否包含子串
Aug 18 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
Nov 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通过COM类调用组件的实现代码
2012/01/11 PHP
php 定义404页面的实现代码
2012/11/19 PHP
php使用类继承解决代码重复的问题
2015/02/11 PHP
Laravel程序架构设计思路之使用动作类
2018/06/07 PHP
javascript编程起步(第二课)
2007/01/10 Javascript
javascript 面向对象编程 function也是类
2009/09/17 Javascript
解决ueditor jquery javascript 取值问题
2014/12/30 Javascript
JavaScript中的普通函数与构造函数比较
2015/04/07 Javascript
javaScript中slice函数用法实例分析
2015/06/08 Javascript
js实现带有介绍的Select列表菜单实例
2015/08/18 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
jquery仿京东商品放大浏览页面
2017/06/06 jQuery
vue axios 给生产环境和发布环境配置不同的接口地址(推荐)
2018/05/08 Javascript
jQuery实现表单动态添加与删除数据操作示例
2018/07/03 jQuery
js控制随机数生成概率代码实例
2019/03/21 Javascript
详解Vue、element-ui、axios实现省市区三级联动
2019/05/07 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
2020/02/16 Javascript
vue 实现根据data中的属性值来设置不同的样式
2020/08/04 Javascript
原生js拖拽功能制作滑动条实例代码
2021/02/05 Javascript
[51:53]完美世界DOTA2联赛决赛日 Inki vs LBZS 第二场 11.08
2020/11/10 DOTA
python使用post提交数据到远程url的方法
2015/04/29 Python
使用Python实现BT种子和磁力链接的相互转换
2015/11/09 Python
Pycharm取消py脚本中SQL识别的方法
2018/11/29 Python
将Python文件打包成.EXE可执行文件的方法
2019/08/11 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
2020/03/09 Python
python plt可视化——打印特殊符号和制作图例代码
2020/04/17 Python
Django ORM实现按天获取数据去重求和例子
2020/05/18 Python
css3的transition属性详解
2014/12/15 HTML / CSS
乐天旅游台湾网站:Rakuten Travel TW
2017/06/01 全球购物
仓库组长岗位职责
2014/01/29 职场文书
收款委托书范本
2014/09/11 职场文书
纪委书记群众路线整改措施思想汇报
2014/10/09 职场文书
党员学习型组织心得体会
2019/06/21 职场文书
关于PostgreSQL JSONB的匹配和交集问题
2021/09/14 PostgreSQL
Element-ui Layout布局(Row和Col组件)的实现
2021/12/06 Vue.js
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
2022/04/29 Servers