Python點陣字

學習python3第一句大概率是 print(“hello world”) 吧?既然可以逐行逐個地輸出字符,那么把字符組成漢字應該也不難吧?經過一番搜索與嘗試,實現了通過python print來打印點陣字的小代碼,請看——

image

點陣字

實現此效果,首先是點陣字的概念:

點陣字體是把每一個字符都分成16×16或24×24個點,然后用每個點的虛實來表示字符的輪廓。點陣字體也叫位圖字體,其中每個字形都以一組二維像素信息表示。

我們拿Python的print來打印的話,最好是有現成可用的點陣字庫,這樣根據其像素信息直接轉化為print的字符就可以了。

HZK16字庫

HZK即漢字庫的首字母縮寫,HZK16字庫是符合GB2312標準的16×16點陣字庫,支持的漢字有6763個,每個漢字模型需要16×16一共需要256個點來顯示,每個點是二進制位也就是2的256次方數據,即32個字節。

那么思路清晰了,根據字符串中漢字字符編碼,去HZK16字庫中獲取點陣信息,拿到信息后根據16*16點陣每個點的數據,print出不同字符。

代碼思路

代碼細節可以點擊左下角“閱讀原文”查看,或者后臺回復print代碼獲取,在這里只列部分實現單字的代碼片段。

 import binascii
 KEYS = [0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01]

 #初始化16*16的點陣位置,每個漢字需要16*16=256個點來表示
 rect_list = [] * 16
 for i in range(16):
      rect_list.append([] * 16)
 
 #拿“贊”字來演示
 text = "贊"
 
 #獲取中文的編碼
 gb2312 = text.encode('gb2312')
 
hex_str = binascii.b2a_hex(gb2312)
 
result = str(hex_str, encoding='utf-8')

#根據編碼計算“贊”在漢字庫中的位置
area = eval('0x' + result[:2]) - 0xA0

index = eval('0x' + result[2:]) - 0xA0

offset = (94 * (area-1) + (index-1)) * 32

font_rect = None

#讀取HZK16漢字庫文件中“贊”字數據
with open("HZK16", "rb") as f:
     f.seek(offset)
     font_rect = f.read(32)

#根據讀取到HZK中數據給我們的16*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]
            flag = asc & KEYS[i]
            row_list.append(flag)
 
#根據獲取到的16*16點陣信息,打印到控制臺
for row in rect_list:
     for i in row:
         if i:
             #前景字符(即用來表示漢字筆畫的輸出字符)
             print('0', end=' ')
         else:
 
             # 背景字符(即用來表示背景的輸出字符)
             print('.', end=' ')
     print()

單字效果

image

多字效果

image

以及Pycharm編輯器中輸出效果如下

image

最終成果

用戶自定義輸入漢字或短語,運行代碼用自定義的符號來展示點陣字:

源代碼:

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)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容