python输出大字号汉字_Python print 玩转点阵字
學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)) * 32
font_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 = [] * 16
for 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)) * 32
font_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編輯器多字效果
最終成果
好,以上基本是完工了,以下是錄屏制作的幾個效果動圖
吃雞篇Python玩轉點陣字-吃雞篇https://www.zhihu.com/video/1068558099773698048
表白篇Python玩轉點陣字-表白篇https://www.zhihu.com/video/1068556292737572864
人生苦短篇Python玩轉點陣字-人生苦短篇https://www.zhihu.com/video/1068556513680953344
新年祝福篇Python玩轉點陣字-祝福篇https://www.zhihu.com/video/1068556670858334208
代碼文件下載
注意:運行代碼時要在代碼文件所在文件夾內添加HZK16文件,否則是拿不到點陣數據,HZK16文件在下載鏈接中可以找到
參考鏈接一個在線轉點陣字的網站,最初就是通過此網站確定了要在命令行輸出點陣字的思路,查了代碼后發現它應該是獲取了輸入信息后傳到后臺獲取點陣數據,這個后臺轉換過程并不清楚
代碼參考一:該代碼語句較全且簡單,但是縮進被省掉了而且沒有給出import和KEYS定義,直接跑不能跑通
代碼參考二:此代碼需要調整hzk16h文件的路徑,同時我沒搞懂88行的ft=”/static/*”這一句的意思,導致沒跑通,只參考了上面的函數方法:
總結
以上是生活随笔為你收集整理的python输出大字号汉字_Python print 玩转点阵字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS6.5安装Chromium谷
- 下一篇: perp系列之四:perp下载