点阵汉字打印

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

### 如何用编程语言通过 `*` 实现点阵汉字输出 要实现通过 `*` 来表示点阵汉字的输出功能,可以基于已有的点阵数据文件(如 HZK16 字库),读取对应的点阵信息并将其转换为由字符 `*` 和空格组成的图形。以下是具体的实现方法: #### 方法概述 点阵字体通常存储在一个二进制文件中,例如 HZK16 文件。每个汉字对应一组 16×16 的像素矩阵,其中每一位代表一个像素点的状态(亮或暗)。可以通过逐位解析这些数据来构建所需的点阵图案。 --- #### C/C++ 实现代码示例 以下是一个完整的程序框架,用于从 HZK16 数据文件中提取指定汉字点阵信息,并以 `*` 表示点亮的像素点[^2]。 ```c #include <stdio.h> #include <string.h> // 定义显示函数 void ShowImage(unsigned char high, unsigned char low, FILE *f) { // 计算偏移地址 long offset = ((high - 0xA1) * 94 + (low - 0xA1)) * 32; fseek(f, offset, SEEK_SET); // 遍历每行的数据 for (int row = 0; row < 16; ++row) { unsigned char byte1, byte2; fread(&byte1, 1, 1, f); fread(&byte2, 1, 1, f); // 解析两位字节中的8个比特 for (int col = 0; col < 8; ++col) { if (((byte1 >> (7 - col)) & 1) != 0) putchar('*'); else putchar(' '); } for (int col = 0; col < 8; ++col) { if (((byte2 >> (7 - col)) & 1) != 0) putchar('*'); else putchar(' '); } // 每处理完一行打印换行符 putchar('\n'); } } int main() { // 用户输入高字节和低字节 unsigned char high, low; printf("请输入汉字的区位码(高位低位): "); scanf("%c %c", &high, &low); // 打开 HZK16 字库文件 FILE *file = fopen("HZK16.DAT", "rb"); if (!file) { perror("无法打开 HZK16.DAT 文件"); return 1; } // 调用显示函数 ShowImage(high, low, file); // 关闭文件 fclose(file); return 0; } ``` 上述代码实现了如下功能: - **输入**: 接收用户输入的汉字区位码(高位和低位)。 - **文件操作**: 使用二进制模式打开 HZK16 字库文件,并定位到目标汉字的位置。 - **点阵解析**: 将每一行的两个字节拆分为 16 个比特,分别映射为 `*` 或空格。 - **输出**: 构建出由 `*` 组成的点阵汉字图像。 --- #### 注意事项 1. **编码范围验证** 点阵汉字的区位码应位于 GB2312 编码范围内(即 `(high >= 0xA1 && high <= 0xF7)` 并且 `(low >= 0xA1 && low <= 0xFE)`)。如果超出此范围,则需提示错误消息。 2. **文件路径配置** 确保运行环境中有名为 `HZK16.DAT` 的点阵字库文件,并放置于可访问目录下。 3. **性能优化** 如果频繁调用该功能,建议缓存常用汉字点阵数据以减少磁盘 I/O 开销。 --- ### 示例运行效果 假设输入汉字“福”的区位码为 `B9 F9`,则可能得到如下输出: ``` ******** ****** **** ***** *** *** ** ** ** *** ** **** ** ****** ****** ******** **************** ** * ** ** ** *** ** **** ** ***** ** ****** ``` --- ####
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值