点阵汉字打印

        读取汉字点阵文件(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)

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值