日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

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

發(fā)布時(shí)間:2023/12/8 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python输出大字号汉字_Python print 玩转点阵字 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

學(xué)python3第一句大概率是 print("hello world") 吧,既然可以逐行逐個(gè)地輸出字符,那么把字符組成漢字應(yīng)該也不難吧?經(jīng)過(guò)一番搜索與嘗試,實(shí)現(xiàn)了通過(guò)python print來(lái)打印點(diǎn)陣字的小代碼。

點(diǎn)陣字

實(shí)現(xiàn)此效果,首先是點(diǎn)陣字的概念:點(diǎn)陣字體是把每一個(gè)字符都分成16×16或24×24個(gè)點(diǎn),然后用每個(gè)點(diǎn)的虛實(shí)來(lái)表示字符的輪廓。點(diǎn)陣字體也叫位圖字體,其中每個(gè)字形都以一組二維像素信息表示。

我們拿Python print來(lái)打印的話,最好是有現(xiàn)成可用的點(diǎn)陣字庫(kù),這樣根據(jù)其像素信息直接轉(zhuǎn)化為print的字符就可以了。

HZK16字庫(kù)

HZK即漢字庫(kù)的首字母縮寫,HZK16字庫(kù)是符合GB2312標(biāo)準(zhǔn)的16×16點(diǎn)陣字庫(kù),支持的漢字有6763個(gè),每個(gè)漢字模型需要16×16一共需要256個(gè)點(diǎn)來(lái)顯示,每個(gè)點(diǎn)是二進(jìn)制位也就是2的256次方數(shù)據(jù),即32個(gè)字節(jié)。

那么思路清晰了,根據(jù)字符串中漢字字符編碼,去HZK16字庫(kù)中獲取點(diǎn)陣信息,拿到信息后根據(jù)16*16點(diǎn)陣每個(gè)點(diǎn)的數(shù)據(jù),print出不同字符。

實(shí)現(xiàn)單字

單字代碼

根據(jù)思路,附上代碼,逐行加了解釋。

注意:運(yùn)行代碼時(shí)要在代碼文件所在文件夾內(nèi)添加HZK16文件,否則是拿不到點(diǎn)陣數(shù)據(jù)的,HZK16文件在文末鏈接中可以下載。

import binascii

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

# 初始化16*16的點(diǎn)陣位置,每個(gè)漢字需要16*16=256個(gè)點(diǎn)來(lái)表示,需要32個(gè)字節(jié)才能顯示一個(gè)漢字

# 之所以32字節(jié):256個(gè)點(diǎn)每個(gè)點(diǎn)是0或1,那么總共就是2的256次方,一個(gè)字節(jié)是2的8次方

rect_list = [] * 16

for i in range(16):

rect_list.append([] * 16)

#拿“贊”字來(lái)演示

text = "贊"

#獲取中文的gb2312編碼,一個(gè)漢字是由2個(gè)字節(jié)編碼組成

gb2312 = text.encode('gb2312')

#將二進(jìn)制編碼數(shù)據(jù)轉(zhuǎn)化為十六進(jìn)制數(shù)據(jù)

hex_str = binascii.b2a_hex(gb2312)

#將數(shù)據(jù)按unicode轉(zhuǎn)化為字符串

result = str(hex_str, encoding='utf-8')

#前兩位對(duì)應(yīng)漢字的第一個(gè)字節(jié):區(qū)碼,每一區(qū)記錄94個(gè)字符

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

#后兩位對(duì)應(yīng)漢字的第二個(gè)字節(jié):位碼,是漢字在其區(qū)的位置

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

#漢字在HZK16中的絕對(duì)偏移位置,最后乘32是因?yàn)樽謳?kù)中的每個(gè)漢字字模都需要32字節(jié)

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

font_rect = None

#讀取HZK16漢字庫(kù)文件

with open("HZK16", "rb") as f:

#找到目標(biāo)漢字的偏移位置

f.seek(offset)

#從該字模數(shù)據(jù)中讀取32字節(jié)數(shù)據(jù)

font_rect = f.read(32)

#font_rect的長(zhǎng)度是32,此處相當(dāng)于for k in range(16)

for k in range(len(font_rect) // 2):

#每行數(shù)據(jù)

row_list = rect_list[k]

for j in range(2):

for i in range(8):

asc = font_rect[k * 2 + j]

#此處&為Python中的按位與運(yùn)算符

flag = asc & KEYS[i]

#數(shù)據(jù)規(guī)則獲取字模中數(shù)據(jù)添加到16行每行中16個(gè)位置處每個(gè)位置

row_list.append(flag)

#根據(jù)獲取到的16*16點(diǎn)陣信息,打印到控制臺(tái)

for row in rect_list:

for i in row:

if i:

#前景字符(即用來(lái)表示漢字筆畫的輸出字符)

print('0', end=' ')

else:

# 背景字符(即用來(lái)表示背景的輸出字符)

print('.', end=' ')

print()

命令行中效果

pycharm編輯器中效果

注意row_list = rect_list[k]這句,這里涉及列表的引用,即之后代碼給row_list做了賦值或改變,rect_list中也跟著改變,因?yàn)槎呤且玫耐粋€(gè)列表。

實(shí)現(xiàn)多字

多字代碼

在單字基礎(chǔ)上添加了多字單行輸出,原理就是在單字形成的rect_list列表中繼續(xù)添加新字的點(diǎn)陣信息,最后統(tǒng)一print輸出。為了增加趣味性,代碼中允許用戶輸入自定義漢字短語(yǔ),來(lái)進(jìn)行點(diǎn)陣字展現(xiàn)

此外將打印點(diǎn)陣字整理成方法,將筆畫和背景的展示符號(hào)也定義為參數(shù)可以進(jìn)行設(shè)置。

import binascii

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

def printPlay(textStr,line,background):

# 初始化16*16的點(diǎn)陣位置,每個(gè)漢字需要16*16=256個(gè)點(diǎn)來(lái)表示,需要32個(gè)字節(jié)才能顯示一個(gè)漢字

# 之所以32字節(jié):256個(gè)點(diǎn)每個(gè)點(diǎn)是0或1,那么總共就是2的256次方,一個(gè)字節(jié)是2的8次方

rect_list = [] * 16

for i in range(16):

rect_list.append([] * 16)

for text in textStr:

#獲取中文的gb2312編碼,一個(gè)漢字是由2個(gè)字節(jié)編碼組成

gb2312 = text.encode('gb2312')

#將二進(jìn)制編碼數(shù)據(jù)轉(zhuǎn)化為十六進(jìn)制數(shù)據(jù)

hex_str = binascii.b2a_hex(gb2312)

#將數(shù)據(jù)按unicode轉(zhuǎn)化為字符串

result = str(hex_str, encoding='utf-8')

#前兩位對(duì)應(yīng)漢字的第一個(gè)字節(jié):區(qū)碼,每一區(qū)記錄94個(gè)字符

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

#后兩位對(duì)應(yīng)漢字的第二個(gè)字節(jié):位碼,是漢字在其區(qū)的位置

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

#漢字在HZK16中的絕對(duì)偏移位置,最后乘32是因?yàn)樽謳?kù)中的每個(gè)漢字字模都需要32字節(jié)

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

font_rect = None

#讀取HZK16漢字庫(kù)文件

with open("HZK16", "rb") as f:

#找到目標(biāo)漢字的偏移位置

f.seek(offset)

#從該字模數(shù)據(jù)中讀取32字節(jié)數(shù)據(jù)

font_rect = f.read(32)

#font_rect的長(zhǎng)度是32,此處相當(dāng)于for k in range(16)

for k in range(len(font_rect) // 2):

#每行數(shù)據(jù)

row_list = rect_list[k]

for j in range(2):

for i in range(8):

asc = font_rect[k * 2 + j]

#此處&為Python中的按位與運(yùn)算符

flag = asc & KEYS[i]

#數(shù)據(jù)規(guī)則獲取字模中數(shù)據(jù)添加到16行每行中16個(gè)位置處每個(gè)位置

row_list.append(flag)

#根據(jù)獲取到的16*16點(diǎn)陣信息,打印到控制臺(tái)

for row in rect_list:

for i in row:

if i:

#前景字符(即用來(lái)表示漢字筆畫的輸出字符)

print(line, end=' ')

else:

# 背景字符(即用來(lái)表示背景的輸出字符)

print(background, end=' ')

print()

#----------------------------以上是庫(kù)的引用和函數(shù)定義,下面是代碼正文----------------------

#允許用戶自定義輸入漢字短語(yǔ)

inpt = input("寫你所想:")

#自定義點(diǎn)陣字中筆畫的符號(hào)

lineSign = '■'

#備選方案

#lineSign = "0"

#自定義點(diǎn)陣字的背景符號(hào)

backgroundSign = '○'

#備選方案

#backgroundSign = "."

#調(diào)用之前定義好的函數(shù),打印最終成果

printPlay(inpt,lineSign,backgroundSign)

多字命令行效果

pycharm編輯器多字效果

最終成果

好,以上基本是完工了,以下是錄屏制作的幾個(gè)效果動(dòng)圖

吃雞篇Python玩轉(zhuǎn)點(diǎn)陣字-吃雞篇https://www.zhihu.com/video/1068558099773698048

表白篇Python玩轉(zhuǎn)點(diǎn)陣字-表白篇https://www.zhihu.com/video/1068556292737572864

人生苦短篇Python玩轉(zhuǎn)點(diǎn)陣字-人生苦短篇https://www.zhihu.com/video/1068556513680953344

新年祝福篇Python玩轉(zhuǎn)點(diǎn)陣字-祝福篇https://www.zhihu.com/video/1068556670858334208

代碼文件下載

注意:運(yùn)行代碼時(shí)要在代碼文件所在文件夾內(nèi)添加HZK16文件,否則是拿不到點(diǎn)陣數(shù)據(jù),HZK16文件在下載鏈接中可以找到

參考鏈接一個(gè)在線轉(zhuǎn)點(diǎn)陣字的網(wǎng)站,最初就是通過(guò)此網(wǎng)站確定了要在命令行輸出點(diǎn)陣字的思路,查了代碼后發(fā)現(xiàn)它應(yīng)該是獲取了輸入信息后傳到后臺(tái)獲取點(diǎn)陣數(shù)據(jù),這個(gè)后臺(tái)轉(zhuǎn)換過(guò)程并不清楚

代碼參考一:該代碼語(yǔ)句較全且簡(jiǎn)單,但是縮進(jìn)被省掉了而且沒(méi)有給出import和KEYS定義,直接跑不能跑通

代碼參考二:此代碼需要調(diào)整hzk16h文件的路徑,同時(shí)我沒(méi)搞懂88行的ft=”/static/*”這一句的意思,導(dǎo)致沒(méi)跑通,只參考了上面的函數(shù)方法:

總結(jié)

以上是生活随笔為你收集整理的python输出大字号汉字_Python print 玩转点阵字的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。