Python print 玩转点阵字
Python print 玩转点阵字
- 效果图
- 点阵字
- HZK16字库
- 实现单字
- 单字代码
- 命令行中效果
- pycharm编辑器中效果
- 实现多字
- 多字代码
- 多字命令行效果
- pycharm编辑器多字效果
- 最终成果
- 吃鸡篇
- 表白篇
- 人生苦短篇
- 新年祝福篇
- 代码文件下载
- github下载
- csdn下载
- 参考链接
- 求关注
效果图
学python3第一句大概率是 print(“hello world”) 吧,既然可以逐行逐个地输出字符,那么把字符组成汉字应该也不难吧?经过一番搜索与尝试,实现了通过python print来打印点阵字的小代码。
点阵字
实现此效果,首先是点阵字的概念:点阵字体是把每一个字符都分成16×16或24×24个点,然后用每个点的虚实来表示字符的轮廓。点阵字体也叫位图字体,其中每个字形都以一组二维像素信息表示。
我们拿Python print来打印的话,最好是有现成可用的点阵字库,这样根据其像素信息直接转化为print的字符就可以了。
HZK16字库
HZK即汉字库的首字母缩写,HZK16字库是符合GB2312标准的16×16点阵字库,支持的汉字有6763个,每个汉字模型需要16×16一共需要256个点来显示,每个点是二进制位也就是2的256次方数据,即32个字节。
那么思路清晰了,根据字符串中汉字字符编码,去HZK16字库中获取点阵信息,拿到信息后根据16*16点阵每个点的数据,print出不同字符。
实现单字
单字代码
根据思路,附上代码,逐行加了解释。
注意:运行代码时要在代码文件所在文件夹内添加HZK16文件,否则是拿不到点阵数据的,HZK16文件在文末附件中可以下载。
import binascii
KEYS = [0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01]# 初始化16*16的点阵位置,每个汉字需要16*16=256个点来表示,需要32个字节才能显示一个汉字
# 之所以32字节:256个点每个点是0或1,那么总共就是2的256次方,一个字节是2的8次方
rect_list = [] * 16
for i in range(16):rect_list.append([] * 16)#拿“赞”字来演示
text = "赞"#获取中文的gb2312编码,一个汉字是由2个字节编码组成
gb2312 = text.encode('gb2312')#将二进制编码数据转化为十六进制数据
hex_str = binascii.b2a_hex(gb2312)#将数据按unicode转化为字符串
result = str(hex_str, encoding='utf-8')#前两位对应汉字的第一个字节:区码,每一区记录94个字符
area = eval('0x' + result[:2]) - 0xA0#后两位对应汉字的第二个字节:位码,是汉字在其区的位置
index = eval('0x' + result[2:]) - 0xA0#汉字在HZK16中的绝对偏移位置,最后乘32是因为字库中的每个汉字字模都需要32字节
offset = (94 * (area-1) + (index-1)) * 32font_rect = None#读取HZK16汉字库文件
with open("HZK16", "rb") as f:#找到目标汉字的偏移位置f.seek(offset)#从该字模数据中读取32字节数据font_rect = f.read(32)#font_rect的长度是32,此处相当于for k in range(16)
for k in range(len(font_rect) // 2):#每行数据row_list = rect_list[k]for j in range(2):for i in range(8):asc = font_rect[k * 2 + j]#此处&为Python中的按位与运算符flag = asc & KEYS[i]#数据规则获取字模中数据添加到16行每行中16个位置处每个位置row_list.append(flag)#根据获取到的16*16点阵信息,打印到控制台
for row in rect_list:for i in row:if i:#前景字符(即用来表示汉字笔画的输出字符)print('0', end=' ')else:# 背景字符(即用来表示背景的输出字符)print('.', end=' ')print()
命令行中效果
pycharm编辑器中效果
注意row_list = rect_list[k]这句,这里涉及列表的引用,即之后代码给row_list做了赋值或改变,rect_list中也跟着改变,因为二者是引用的同一个列表。
实现多字
多字代码
在单字基础上添加了多字单行输出,原理就是在单字形成的rect_list列表中继续添加新字的点阵信息,最后统一print输出。为了增加趣味性,代码中允许用户输入自定义汉字短语,来进行点阵字展现
此外将打印点阵字整理成方法,将笔画和背景的展示符号也定义为参数可以进行设置。
import binascii
KEYS = [0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01]def printPlay(textStr,line,background):# 初始化16*16的点阵位置,每个汉字需要16*16=256个点来表示,需要32个字节才能显示一个汉字# 之所以32字节:256个点每个点是0或1,那么总共就是2的256次方,一个字节是2的8次方rect_list = [] * 16for i in range(16):rect_list.append([] * 16)for text in textStr:#获取中文的gb2312编码,一个汉字是由2个字节编码组成gb2312 = text.encode('gb2312')#将二进制编码数据转化为十六进制数据hex_str = binascii.b2a_hex(gb2312)#将数据按unicode转化为字符串result = str(hex_str, encoding='utf-8')#前两位对应汉字的第一个字节:区码,每一区记录94个字符area = eval('0x' + result[:2]) - 0xA0#后两位对应汉字的第二个字节:位码,是汉字在其区的位置index = eval('0x' + result[2:]) - 0xA0#汉字在HZK16中的绝对偏移位置,最后乘32是因为字库中的每个汉字字模都需要32字节offset = (94 * (area-1) + (index-1)) * 32font_rect = None#读取HZK16汉字库文件with open("HZK16", "rb") as f:#找到目标汉字的偏移位置f.seek(offset)#从该字模数据中读取32字节数据font_rect = f.read(32)#font_rect的长度是32,此处相当于for k in range(16)for k in range(len(font_rect) // 2):#每行数据row_list = rect_list[k]for j in range(2):for i in range(8):asc = font_rect[k * 2 + j]#此处&为Python中的按位与运算符flag = asc & KEYS[i]#数据规则获取字模中数据添加到16行每行中16个位置处每个位置row_list.append(flag)#根据获取到的16*16点阵信息,打印到控制台for row in rect_list:for i in row:if i:#前景字符(即用来表示汉字笔画的输出字符)print(line, end=' ')else:# 背景字符(即用来表示背景的输出字符)print(background, end=' ')print()#----------------------------以上是库的引用和函数定义,下面是代码正文----------------------
#允许用户自定义输入汉字短语
inpt = input("写你所想:")#自定义点阵字中笔画的符号
lineSign = '■'
#备选方案
#lineSign = "0"#自定义点阵字的背景符号
backgroundSign = '○'
#备选方案
#backgroundSign = "."#调用之前定义好的函数,打印最终成果
printPlay(inpt,lineSign,backgroundSign)
多字命令行效果
pycharm编辑器多字效果
最终成果
好,以上基本是完工了,以下是录屏制作的几个效果动图
吃鸡篇
表白篇
人生苦短篇
新年祝福篇
代码文件下载
github下载
https://github.com/pengfexue2/printPlay.git
csdn下载
https://download.csdn.net/download/weixin_40796925/10918320
参考链接
一个在线转点阵字的网站,最初就是通过此网站确定了要在命令行输出点阵字的思路,查了代码后发现它应该是获取了输入信息后传到后台获取点阵数据,这个后台转换过程并不清楚
http://life.chacuo.net/convertfont2char代码参考一:该代码语句较全且简单,但是缩进被省掉了而且没有给出import和KEYS定义,直接跑不能跑通
https://www.izhangchao.com/internet/internet_234432.html代码参考二:此代码需要调整hzk16h文件的路径,同时我没搞懂88行的ft=”/static/*”这一句的意思,导致没跑通,只参考了上面的函数方法:
https://blog.csdn.net/five3/article/details/78229017HZK16字库的介绍与使用方法:
https://blog.csdn.net/ultraman_hs/article/details/69668892
求关注
最最后,欢迎关注我的微信公众号 TEDxPY,目前专注于python学习和小代码的挖掘,希望见证彼此成长,比心
Python print 玩转点阵字相关推荐
- python print 字体大小_Python print 玩转“点阵字”
原标题:Python print 玩转"点阵字" 学习python3第一句大概率是 print("hello world") 吧?既然可以逐行逐个地输出字符,那 ...
- python输出大字号汉字_Python print 玩转点阵字
学python3第一句大概率是 print("hello world") 吧,既然可以逐行逐个地输出字符,那么把字符组成汉字应该也不难吧?经过一番搜索与尝试,实现了通过python ...
- python 桌面歌词_Python点阵字玩转动态歌词
原标题:Python点阵字玩转动态歌词 前面我们讲到了可以自定义输入汉字,然后用点阵字来展现,接下来我们挖掘下更有趣的玩法.想法来自于听歌时桌面动态歌词,我们的点阵字既然可以自定义输入识别,何不读取歌 ...
- python画图武汉加油-python实现“武汉加油”点阵字
点阵字 实现此效果,首先是点阵字的概念:点阵字体是把每一个字符都分成16×16或24×24个点,然后用每个点的虚实来表示字符的轮廓.点阵字体也叫位图字体,其中每个字形都以一组二维像素信息表示. 我们拿 ...
- python print打印設置字體顔色
背景: python打印只有白色太单调 cprint 库还要安装使用又不方便,于是在想有没有其他办法打印出颜色 代码实现 class BCOLOR:def __init__(self):self.HE ...
- python设置桌面歌词_Python点阵字玩转动态歌词
前面我们讲到了可以自定义输入汉字,然后用点阵字来展现,接下来我们挖掘下更有趣的玩法.想法来自于听歌时桌面动态歌词,我们的点阵字既然可以自定义输入识别,何不读取歌词文件随着歌曲播放动态显示呢? 下面介绍 ...
- 点阵字python_Python点阵字玩转动态歌词
前面我们讲到了可以自定义输入汉字,然后用点阵字来展现,接下来我们挖掘下更有趣的玩法.想法来自于听歌时桌面动态歌词,我们的点阵字既然可以自定义输入识别,何不读取歌词文件随着歌曲播放动态显示呢? 下面介绍 ...
- php图片点阵,HTML5边玩边学(八)-砖块贴图点阵字
原来以为象坦克大战.超级玛丽之类的小游戏,开始画面里面的砖块字是静态图片,现在才知道原来都是动态贴图贴出来的,下面用 HTML5 的绘图功能,咱也太做一个坦克大决战的开始画面,顺便研究一下点阵字. 一 ...
- 一篇长文带你在python里玩转Json数据
Json简介 Json(JavaScript Object Notation) 很多网站都会用到Json格式来进行数据的传输和交换. 这因为Json是一种轻量级的数据交换格式,具有数据格式简单,读写方 ...
最新文章
- 利用计算机网络共享传文件,利用windows7系统家庭组让多台电脑(传送文件)资源共享...
- java自学小段 产生随机数
- idea springboot 发布webservice 发布服务_太赞了:Spring boot+redis实现消息发布与订阅...
- 从程序设计角度看B/S C/S到底有什么不同???
- oracle数据库在sqlplus登录时遇到的问题
- Win32多线程编程(2) — 线程控制
- axure怎么做5秒倒计时_罗胖60秒:怎么做一个课程?
- 小程序php支付,前后端分离
- a16z和斯坦福大学区块链研究中心将于5月4日举行NFT虚拟峰会
- 经典代码d359f1d82912ef1b1cd784bd28829325
- [数学建模]数学规划模型
- 如何转换html转化mp4,格式互转技巧:webm格式怎么转换mp4?
- java之STS使用和相关目录解说、springBoot微服务项目、前后端发送和接收参数的方式、文件图片视频上传
- 微信小程序使用云函数进行mysql操作
- 三级网络技术备考重点之路由器配置及使用
- 生鲜配送系统软件排名
- 设计一个互联网交换设备的SNMP MIB库“X-MIB”
- 函数式接口 BiConsumer接口和Consumer接口
- fcpx插件:Stupid Raisins Grid Pop(网格弹出布局模板)
- 什么是“反射”和“内省”?
热门文章
- mysql远程服务器返回错误404_服务器常见页面访问返回错误信息(404 500 400)表示什么意思...
- 对付木马:空手入白刃谁动了我的电脑系统(转)
- MATLAB中FIR滤波器的时延溢出问题详解:线性相位对信号造成的时延溢出及其消除方法,以及fir1等函数的使用
- Java学习笔记【入门】(1):Java版本介绍
- Oracle——获取当前系统时间以及插入日期型数据(to_date的用法)
- linux常用命令及通过浏览器访问linux文件功能
- VPS8701 电源管理(PMIC) VPS8701
- springboot整合Hystrix 熔断器
- 第六章-Python数据可视化--2
- 想不到验证码背后的故事这么有意思