學python3第一句大機率是 print(“hello world”) 吧,既然可以逐行逐個地輸出字元,那麼把字元組成漢字應該也不難吧?經過一番搜尋與嘗試,實現了透過python print來列印點陣字的小程式碼。

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()

命令列中效果

Python print 玩轉點陣字

pycharm編輯器中效果

Python print 玩轉點陣字

注意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)

多字命令列效果

Python print 玩轉點陣字

pycharm編輯器多字效果

Python print 玩轉點陣字

最終成果

好,以上基本是完工了,以下是錄屏製作的幾個效果動圖

吃雞篇

Python print 玩轉點陣字

Python玩轉點陣字-吃雞篇

https://www。zhihu。com/video/1068558099773698048

表白篇

Python print 玩轉點陣字

Python玩轉點陣字-表白篇

https://www。zhihu。com/video/1068556292737572864

人生苦短篇

Python print 玩轉點陣字

Python玩轉點陣字-人生苦短篇

https://www。zhihu。com/video/1068556513680953344

新年祝福篇

Python print 玩轉點陣字

Python玩轉點陣字-祝福篇

https://www。zhihu。com/video/1068556670858334208

程式碼檔案下載

注意:執行程式碼時要在程式碼檔案所在資料夾內新增HZK16檔案,否則是拿不到點陣資料,HZK16檔案在下載連結中可以找到

github下載

csdn下載

參考連結

一個線上轉點陣字的網站,最初就是透過此網站確定了要在命令列輸出點陣字的思路,查了程式碼後發現它應該是獲取了輸入資訊後傳到後臺獲取點陣資料,這個後臺轉換過程並不清楚

程式碼參考一:該程式碼語句較全且簡單,但是縮排被省掉了而且沒有給出import和KEYS定義,直接跑不能跑通

程式碼參考二:此程式碼需要調整hzk16h檔案的路徑,同時我沒搞懂88行的ft=”/static/*”這一句的意思,導致沒跑通,只參考了上面的函式方法:

HZK16字型檔的介紹與使用方法