读取汉字点阵文件(hzk16.dat文件、16点阵),获取指定汉字的点阵信息,根据点阵信息,显示、特显汉字:完成如下功能:(1)显示自己姓名(分别按列、按行显示),并截图;(2)镜像显示汉字;(3)指定斜率,显示斜体汉字;(4)指定倍数,放大汉字。以上都用自己姓名作为测试,截图。
import binascii
def change(word): # 得到汉字的偏移量
# 获取中文的gb2312编码,一个汉字是由2个字节编码组成
gb2312 = word.encode('gb2312')
# print(gb2312)
# 将二进制编码数据转化为十六进制数据
hex_str = binascii.b2a_hex(gb2312)
# print(hex_str)
# 将数据按unicode转化为字符串
result = str(hex_str, encoding='utf-8')
# print(result)
# 前两位对应汉字的第一个字节:区码,每一区记录94个字符
area = eval('0x' + result[:2]) - 0xA0
# print(area)
# 后两位对应汉字的第二个字节:位码,是汉字在其区的位置
index = eval('0x' + result[2:]) - 0xA0
# print(index)
# 汉字在HZK16中的绝对偏移位置,最后乘32是因为字库中的每个汉字字模都需要32字节
offset = (94 * (area - 1) + (index - 1)) * 32
return offset
def hengban(list = []): # 在hzk16中找到汉字的字模,并转换成列表
KEYS = [0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01]
list1 = []
# 初始化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 i in range(len(list)):
list1.append(change(list[i]))
font_rect = None
# print(list1)
font_rect = []
# 读取HZK16汉字库文件
with open("HZK16", "rb") as f:
# 找到目标汉字的偏移位置
for i in range(len(list1)):
f.seek(list1[i])
# 从该字模数据中读取32字节数据
font_rect.append(f.read(32))
# print(font_rect)
# font_rect的长度是32,此处相当于for k in range(16)
for x in range(len(font_rect)):
for k in range(len(font_rect[x]) // 2):
# 每行数据
row_list = rect_list[k]
for j in range(2):
for i in range(8):
asc = font_rect[x][k * 2 + j]
# 此处&为Python中的按位与运算符
flag = asc & KEYS[i]
# 数据规则获取字模中数据添加到16行每行中16个位置处每个位置
row_list.append(flag)
# print(rect_list)
return rect_list
def shuban(word): # 竖版的列表
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)
# 获取中文的gb2312编码,一个汉字是由2个字节编码组成
gb2312 = word.encode('gb2312')
# print(gb2312)
# 将二进制编码数据转化为十六进制数据
hex_str = binascii.b2a_hex(gb2312)
# print(hex_str)
# 将数据按unicode转化为字符串
result = str(hex_str, encoding='utf-8')
# print(result)
# 前两位对应汉字的第一个字节:区码,每一区记录94个字符
area = eval('0x' + result[:2]) - 0xA0
# print(area)
# 后两位对应汉字的第二个字节:位码,是汉字在其区的位置
index = eval('0x' + result[2:]) - 0xA0
# print(index)
# 汉字在HZK16中的绝对偏移位置,最后乘32是因为字库中的每个汉字字模都需要32字节
offset = (94 * (area - 1) + (index - 1)) * 32
# print(type(offset))
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)
# print(rect_list)
return rect_list
# 根据获取到的16*16点阵信息,打印到控制台
def jingxiang(jingxaing_list): # 镜像列表
h = []
for i in range(len(jingxaing_list)):
b = jingxaing_list[i][-33::-1]
c = jingxaing_list[i][-17:-33:-1]
d = jingxaing_list[i][-1:-17:-1]
for j in range(len(c)):
b.append(c[j])
for k in range(len(d)):
b.append(d[k])
h.append(b)
return h
def xieti(xieti_list): # 将双行的数据空一格
for i in range(16):
for j in range(i):
if j%2==0:
xieti_list[i].insert(0,'')
return xieti_list
def shuchu(rect_list): # 打印出来
f = open("我的名字", 'a')
for row in rect_list:
f.write('\n')
for i in row:
if i:
f.write("1")
# 前景字符(即用来表示汉字笔画的输出字符)
print('1', end=' ')
else:
f.write(" ")
# 背景字符(即用来表示背景的输出字符)
print(' ', end=' ')
print()
def fangda(n,fangda_list): # 放大字体
f = open("我的名字",'a')
for row in fangda_list:
f.write('\n')
for i in row:
if i:
f.write(n * '1')
# 前景字符(即用来表示汉字笔画的输出字符)
print(n * '1', end=' ')
else:
f.write(n * ' ')
# 背景字符(即用来表示背景的输出字符)
print(n * ' ', end=' ')
print()
if __name__ == '__main__':
# list0 = []
# x = input("输入汉字个数:")
# for i in range(int(x)):
# list0.append(input())
list0 = ["王",'小','帅']
list1 = []
for i in range(len(list0)):
rect_list = shuban(list0[i])
shuchu(rect_list)
list1.append(rect_list)
# print(list1)
hengban_list =hengban(list0)
shuchu(hengban_list)
print('\n')
jingxiang_list = jingxiang(hengban_list)
shuchu(jingxiang_list)
print('\n')
xieti_list = xieti(hengban_list)
shuchu(xieti_list)
print('\n')
n = int(input("请输入需要放大倍数:"))
fangda(n,hengban_list)