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

参考链接

  1. 一个在线转点阵字的网站,最初就是通过此网站确定了要在命令行输出点阵字的思路,查了代码后发现它应该是获取了输入信息后传到后台获取点阵数据,这个后台转换过程并不清楚
    http://life.chacuo.net/convertfont2char

  2. 代码参考一:该代码语句较全且简单,但是缩进被省掉了而且没有给出import和KEYS定义,直接跑不能跑通
    https://www.izhangchao.com/internet/internet_234432.html

  3. 代码参考二:此代码需要调整hzk16h文件的路径,同时我没搞懂88行的ft=”/static/*”这一句的意思,导致没跑通,只参考了上面的函数方法:
    https://blog.csdn.net/five3/article/details/78229017

  4. HZK16字库的介绍与使用方法:
    https://blog.csdn.net/ultraman_hs/article/details/69668892

求关注

最最后,欢迎关注我的微信公众号 TEDxPY,目前专注于python学习和小代码的挖掘,希望见证彼此成长,比心

Python print 玩转点阵字相关推荐

  1. python print 字体大小_Python print 玩转“点阵字”

    原标题:Python print 玩转"点阵字" 学习python3第一句大概率是 print("hello world") 吧?既然可以逐行逐个地输出字符,那 ...

  2. python输出大字号汉字_Python print 玩转点阵字

    学python3第一句大概率是 print("hello world") 吧,既然可以逐行逐个地输出字符,那么把字符组成汉字应该也不难吧?经过一番搜索与尝试,实现了通过python ...

  3. python 桌面歌词_Python点阵字玩转动态歌词

    原标题:Python点阵字玩转动态歌词 前面我们讲到了可以自定义输入汉字,然后用点阵字来展现,接下来我们挖掘下更有趣的玩法.想法来自于听歌时桌面动态歌词,我们的点阵字既然可以自定义输入识别,何不读取歌 ...

  4. python画图武汉加油-python实现“武汉加油”点阵字

    点阵字 实现此效果,首先是点阵字的概念:点阵字体是把每一个字符都分成16×16或24×24个点,然后用每个点的虚实来表示字符的轮廓.点阵字体也叫位图字体,其中每个字形都以一组二维像素信息表示. 我们拿 ...

  5. python print打印設置字體顔色

    背景: python打印只有白色太单调 cprint 库还要安装使用又不方便,于是在想有没有其他办法打印出颜色 代码实现 class BCOLOR:def __init__(self):self.HE ...

  6. python设置桌面歌词_Python点阵字玩转动态歌词

    前面我们讲到了可以自定义输入汉字,然后用点阵字来展现,接下来我们挖掘下更有趣的玩法.想法来自于听歌时桌面动态歌词,我们的点阵字既然可以自定义输入识别,何不读取歌词文件随着歌曲播放动态显示呢? 下面介绍 ...

  7. 点阵字python_Python点阵字玩转动态歌词

    前面我们讲到了可以自定义输入汉字,然后用点阵字来展现,接下来我们挖掘下更有趣的玩法.想法来自于听歌时桌面动态歌词,我们的点阵字既然可以自定义输入识别,何不读取歌词文件随着歌曲播放动态显示呢? 下面介绍 ...

  8. php图片点阵,HTML5边玩边学(八)-砖块贴图点阵字

    原来以为象坦克大战.超级玛丽之类的小游戏,开始画面里面的砖块字是静态图片,现在才知道原来都是动态贴图贴出来的,下面用 HTML5 的绘图功能,咱也太做一个坦克大决战的开始画面,顺便研究一下点阵字. 一 ...

  9. 一篇长文带你在python里玩转Json数据

    Json简介 Json(JavaScript Object Notation) 很多网站都会用到Json格式来进行数据的传输和交换. 这因为Json是一种轻量级的数据交换格式,具有数据格式简单,读写方 ...

最新文章

  1. 利用计算机网络共享传文件,利用windows7系统家庭组让多台电脑(传送文件)资源共享...
  2. java自学小段 产生随机数
  3. idea springboot 发布webservice 发布服务_太赞了:Spring boot+redis实现消息发布与订阅...
  4. 从程序设计角度看B/S C/S到底有什么不同???
  5. oracle数据库在sqlplus登录时遇到的问题
  6. Win32多线程编程(2) — 线程控制
  7. axure怎么做5秒倒计时_罗胖60秒:怎么做一个课程?
  8. 小程序php支付,前后端分离
  9. a16z和斯坦福大学区块链研究中心将于5月4日举行NFT虚拟峰会
  10. 经典代码d359f1d82912ef1b1cd784bd28829325
  11. [数学建模]数学规划模型
  12. 如何转换html转化mp4,格式互转技巧:webm格式怎么转换mp4?
  13. java之STS使用和相关目录解说、springBoot微服务项目、前后端发送和接收参数的方式、文件图片视频上传
  14. 微信小程序使用云函数进行mysql操作
  15. 三级网络技术备考重点之路由器配置及使用
  16. 生鲜配送系统软件排名
  17. 设计一个互联网交换设备的SNMP MIB库“X-MIB”
  18. 函数式接口 BiConsumer接口和Consumer接口
  19. fcpx插件:Stupid Raisins Grid Pop(网格弹出布局模板)
  20. 什么是“反射”和“内省”?

热门文章

  1. mysql远程服务器返回错误404_服务器常见页面访问返回错误信息(404 500 400)表示什么意思...
  2. 对付木马:空手入白刃谁动了我的电脑系统(转)
  3. MATLAB中FIR滤波器的时延溢出问题详解:线性相位对信号造成的时延溢出及其消除方法,以及fir1等函数的使用
  4. Java学习笔记【入门】(1):Java版本介绍
  5. Oracle——获取当前系统时间以及插入日期型数据(to_date的用法)
  6. linux常用命令及通过浏览器访问linux文件功能
  7. VPS8701 电源管理(PMIC) VPS8701
  8. springboot整合Hystrix 熔断器
  9. 第六章-Python数据可视化--2
  10. 想不到验证码背后的故事这么有意思