import numpy as np import PIL.ImageFont as pilfont import PIL.Image as pilimage import PIL.ImageDraw as pildraw # def generate_chinese_struct(char_code, font, size): # image = pilimage.new('L', size) # draw = pildraw.Draw(image) # draw.text((0, 0), char_code, font=font, fill=255) # pixel_array = np.array(image) # result = np.zeros(size[0] * size[1] // 8, dtype=np.uint8) # for i in range(size[1]): # for j in range(size[0] // 8): # for k in range(8): # if pixel_array[j * 8 + k, i]: # result[j * size[1] + i] |= (1 << k) # return result def generate_chinese_struct(char_code, font, size): incode = char_code.encode('gb2312') # 要读出的汉字 qh, wh = incode[0] - 0xa0, incode[1] - 0xa0 # 占两个字节, 取其区位号 if size[0] == 12: offset = (94 * (qh - 1) + (wh - 1)) * 24 # 得到偏移位置 with open("HZK12", "rb") as HZK: HZK.seek(offset) return HZK.read(24) if size[0] == 16: offset = (94 * (qh - 1) + (wh - 1)) * 32 # 得到偏移位置 with open("HZK16", "rb") as HZK: HZK.seek(offset) return HZK.read(32) # from bitarray import bitarray # # from PIL import Image, ImageDraw # # from bitarray import bitarray # def generate_chinese_struct(char_code, font, size): # height=(size[1] + 7) // 8 * 8 # wight=(size[0] + 7) // 8 * 8 # image = Image.new('1', size, 1) # draw = ImageDraw.Draw(image) # draw.text((0, -1), char_code, font=font, fill=0) # image.show() # bitmap = bitarray() # for w in range(size[1]): # for h in range(size[0]): # # if h > size[1] or w > size[0]: # # bitmap.append(False) # # else: # if image.getpixel((w, h)) == 0: # bitmap.append(True) # print('■', end=' ') # else: # bitmap.append(False) # print('0', end=' ') # print() # result = np.zeros(size[0] * size[1] // 8, dtype=np.uint8) # # for i in range(height): # # for j in range(wight // 8): # # for k in range(8): # # if bitmap[j * 8 + k, i]==1: # # result[j * height + i] |= (1 << k) # for h in range(height): # for w in range(wight): # if bitmap[w+h]: # #前景字符(即用来表示汉字笔画的输出字符) # print('■', end=' ') # else: # # # 背景字符(即用来表示背景的输出字符) # print('0', end=' ') # print() # return result def generate_chinese_array(input_str, font_str, size): font = pilfont.truetype(font_str, size=size[1]) chinese_array = [] for char_code in input_str: char_struct = generate_chinese_struct(char_code, font, size) chinese_array.append({'name': char_code, 'data': char_struct}) return chinese_array def format_chinese_array_as_text(chinese_array, size): text_output = "#pragma once\n\n" text_output += "#ifndef HW_LIB_OLED_FONT_CHUC_H\n" text_output += "#define HW_LIB_OLED_FONT_CHUC_H\n\n" text_output += f"typedef struct {{\n" text_output += " uint8_t unicode[2];\n" text_output += f" uint8_t data[{size[0] * ((size[1] + 7) // 8 * 8) // 8}];\n" text_output += "} Chinese_t;\n\n" text_output += f"uint8_t Hzk_size={size[0]};\n\n" text_output += "Chinese_t Hzk[] = {\n" line_size = size[0] * size[1] // 8 line_size = line_size // 2 # line_size = 16 if line_size >= 16 else 8 for item in chinese_array: unicode_hex = ', '.join(f"0x{ord(char) >> 8:02X}, 0x{ord(char) & 0xFF:02X}" for char in item['name']) print(unicode_hex, end=",") text_output += f" {{\n // Original: {item['name']}\n" text_output += f" {{ {unicode_hex} }},\n {{\n " bytes_str = ', '.join(f"0x{byte:02X}" for byte in item['data']) bytes_lines = [bytes_str[i:i + 6 * line_size] for i in range(0, len(bytes_str), 6 * line_size)] # 每行显示line_size个字节 text_output += '\n '.join(bytes_lines) text_output += ",\n }\n },\n" text_output += "};\n\n" # text_output += "Chinese_t* find_chinese_data(uint8_t unicode_high, uint8_t unicode_low) {\n" # text_output += " for (int i = 0; i < sizeof(Hzk) / sizeof(Chinese_t); ++i) {\n" # text_output += " if (Hzk[i].unicode[0] == unicode_high && Hzk[i].unicode[1] == unicode_low) {\n" # text_output += " return &Hzk[i];\n" # text_output += " }\n" # text_output += " }\n" # text_output += " return NULL;\n" # text_output += "}\n" text_output += "\n#endif //HW_LIB_OLED_FONT_CHUC_H" return text_output def generate_and_write_chinese_array_output(): # 生成包含汉字结构体的数组 # simsun: 宋体 # kaiti: 楷体 # size = (12, 12) size = (16, 16) # chinese_array = generate_chinese_array("名字班级", 'simsun', size) chinese_array = generate_chinese_array("姓名学号班级信息显示图片视频专业电子", 'simsun', size) # 将数组格式化为文本输出并写入文件 text_output = format_chinese_array_as_text(chinese_array, size) with open('chinese_array_output.txt', 'w') as file: file.write(text_output) # 调用函数生成并写入汉字数组输出文件 generate_and_write_chinese_array_output() def generate_unicode_bin_file(): font = pilfont.truetype('simsun', size=16) with open('cao.bin', 'wb') as file: for char_code in range(0x4e00, 0xa000): result = generate_chinese_struct(chr(char_code), font) file.write(result) file.close() # 调用函数生成Unicode二进制文件 # generate_unicode_bin_file()