UP font generate

This commit is contained in:
JiXieShi
2024-11-27 21:57:04 +08:00
parent a1176112ce
commit a0783abd1a
29 changed files with 1859 additions and 146 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+98 -146
View File
@@ -1,154 +1,106 @@
import numpy as np
import PIL.ImageFont as pilfont
import PIL.Image as pilimage
import PIL.ImageDraw as pildraw
Font_Lib = {
"HZK12": {"size": 12, "desc": "宋体优化"},
"HZK16": {"size": 16, "desc": "宋体优化"},
"HZK32": {"size": 32, "desc": "宋体优化"},
"HZK16S": {"size": 16, "desc": "宋体"},
"HZK16F": {"size": 16, "desc": "仿宋"},
"HZK16H": {"size": 16, "desc": "黑体"},
"HZK16K": {"size": 16, "desc": "楷体"},
"HZK16Y": {"size": 16, "desc": "幼圆"},
"HZK16L": {"size": 16, "desc": "隶书(效果较差)"},
"HZK16C": {"size": 16, "desc": "粗体"},
"HZK16X": {"size": 16, "desc": ""},
"HZK16V": {"size": 16, "desc": ""},
"HZK24F": {"size": 24, "desc": "仿宋汉字打印点阵"},
"HZK24H": {"size": 24, "desc": "黑体汉字打印点阵"},
"HZK24K": {"size": 24, "desc": "楷体汉字打印点阵"},
"HZK24S": {"size": 24, "desc": "宋体汉字打印点阵"},
"HZK24T": {"size": 24, "desc": "宋体符号打印点阵"},
"HZK40S": {"size": 40, "desc": "宋体汉字"},
"HZK40T": {"size": 40, "desc": "宋体符号"},
"HZK48S": {"size": 48, "desc": "宋体汉字"},
"HZK48T": {"size": 48, "desc": "宋体符号"},
}
# 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
class ChineseFontLibrary:
def __init__(self, name, path="./font_lib/"):
self.size = Font_Lib.get(name)['size']
self.path = path
self.fontname = name
self.chinese_array = []
self.linecache = self.size * ((self.size + 7) // 8 * 8) // 8
def format_chinese_array_as_text(self):
text_output = "#pragma once\n\n"
text_output += "#ifndef HW_LIB_FONT_CHUC_H\n"
text_output += "#define HW_LIB_FONT_CHUC_H\n\n"
text_output += f"typedef struct {{\n"
text_output += " uint8_t unicode[2];\n"
text_output += f" uint8_t data[{self.size * ((self.size + 7) // 8 * 8) // 8}];\n"
text_output += "} Chinese_t;\n\n"
text_output += f"static uint8_t Hzk_size={self.size};\n\n"
text_output += "static Chinese_t Hzk[] = {\n"
line_size = self.size * self.size // 8
line_size = line_size // 2
for item in self.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 += "static 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_FONT_CHUC_H"
return text_output
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:
def generate_chinese_struct(self, code):
incode = code.encode('gb2312') # 要读出的汉字
qh, wh = incode[0] - 0xa0, incode[1] - 0xa0 # 占两个字节, 取其区位号
offset = (94 * (qh - 1) + (wh - 1)) * self.linecache # 得到偏移位置
with open(self.path + self.fontname, "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)
return HZK.read(self.linecache)
def add_chinese_array(self, input_str: str):
for char_code in input_str:
char_struct = self.generate_chinese_struct(char_code)
self.chinese_array.append({'name': char_code, 'data': char_struct})
return self
def write_chinese_array_output(self, filename='font_chuc.h'):
text_output = self.format_chinese_array_as_text()
with open(filename, 'w', encoding="utf8") as file:
file.write(text_output)
# from bitarray import bitarray
# # from PIL import Image, ImageDraw
# # from bitarray import bitarray
if __name__ == '__main__':
i = 0
for k, v in Font_Lib.items():
print(f"{i}:{k} - {v['size']} {v['desc']}")
i += 1
# 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_FONT_CHUC_H\n"
text_output += "#define HW_LIB_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"static uint8_t Hzk_size={size[0]};\n\n"
text_output += "static 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 += "static 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_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('font_chuc.h', 'w', encoding="utf8") 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()
input_c = input(f"请输入需要的字体序号(q退出):")
if input_c == 'q':
exit()
values_list = list(Font_Lib.values())
keys_list = list(Font_Lib.keys())
key_index = list(Font_Lib.values()).index(values_list[int(input_c)])
print(
f"已选择{int(input_c)}:{keys_list[key_index]} - {Font_Lib[keys_list[key_index]]['size']} {Font_Lib[keys_list[key_index]]['desc']}")
font = ChineseFontLibrary(keys_list[key_index])
input_c = input(f"请输入需要生成的字符(顺序无关):")
print("将生成以下字符\n" + input_c)
font.add_chinese_array(input_c)
font.write_chinese_array_output()