日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PCtoLCD2002 生成字模转换为字库 .h文件

發布時間:2023/12/9 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PCtoLCD2002 生成字模转换为字库 .h文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

打開字體取模軟件PCtoLCD2002.exe,選項進行如下設置:

然后在下方打入需要取的漢字,點擊生成字模,生成字模,存儲字模的txt文件。

使用如下python代碼, 將生成字模轉換為字庫的.h文件
txt與python文件放在同一目錄下

# 說明: # 每次生成字庫的字數限制: 100及以內 # 取模字高/寬限制: 3-256 # 取模字高寬比任意 import codecs import os import chardet# 獲取文件編碼類型 def get_encoding(file):# 二進制方式讀取,獲取字節數據,檢測類型with open(file, 'rb') as f:return chardet.detect(f.read())['encoding']# 刪除列表多余元素 def remove_list_items(list_name):while ' ' in list_name:list_name.remove(' ')while '\n' in list_name:list_name.remove('\n')while '(' in list_name:list_name.remove('(')while ')' in list_name:list_name.remove(')')# 獲取每個漢字所用的行數 def recognize_line_nums(file_list_name):lines_num_of_index = file_list_name.index('\n')for a in range(lines_num_of_index, len(file_list_name)):if list(file_list_name[a + 1])[-2] == '/':return a - lines_num_of_index + 1break# 獲取需轉換的文件 def get_file_path():dir_list = os.listdir('./')txt_list = []for a in dir_list:if a[-4:] == '.txt':txt_list.append(a)for b in txt_list:print(txt_list.index(b) + 1, '\t', b)choice = int(input('Choose file to generate.'))path = f'./{txt_list[choice - 1]}'return pathfile_path = get_file_path() font_height = int(input('Font Height:')) font_width = int(input('Font Width:')) # ANSI文件轉UTF-8 if not get_encoding(file_path) == 'utf-8':f = codecs.open(file_path, 'r', 'ansi').read()os.remove(file_path) # 刪除文件new_file = codecs.open(file_path, 'w', 'utf-8')new_file.write(f)with open(file_path, 'r', encoding='utf-8') as f1:f1_list = list(f1)lines_num_of_index = f1_list.index('\n')character_num = 0index_list = []for line in range(lines_num_of_index):index_list += list(f1_list[line]) # 索引拼接成一個列表remove_list_items(index_list) # 刪除多余元素,方便計算with open('./Font.h', 'w', encoding='utf-8') as f2:f2.write('#include <pgmspace.h>\n\n')lines_of_each_character = recognize_line_nums(f1_list)if not lines_of_each_character == 1:for i in range(lines_num_of_index + 1, len(f1_list) - 2, lines_of_each_character):if character_num < 10:f2.write(f'const unsigned char hz_{character_num} PROGMEM[] = \n')character_num += 1line_first_list = list(f1_list[i])line_first_list[-2] = ','line_first_str = ''.join(line_first_list)f2.write(line_first_str)i += 1if lines_of_each_character > 2:for each_line in range(lines_of_each_character - 2):line_list = list(f1_list[i])line_list[0] = ''line_list[-2] = ','line_str = ''.join(line_list)f2.write(line_str)i += 1line2_list = list(f1_list[i])line2_list[0] = ''line2_list[-11] = '};'line2_str = ''.join(line2_list)f2.write(line2_str)f2.write('\n')elif 10 <= character_num < 100:f2.write(f'const unsigned char hz_{character_num} PROGMEM[] = \n')character_num += 1line_first_list = list(f1_list[i])line_first_list[-2] = ','line_first_str = ''.join(line_first_list)f2.write(line_first_str)i += 1if lines_of_each_character > 2:for each_line in range(lines_of_each_character - 2):line_list = list(f1_list[i])line_list[0] = ''line_list[-2] = ','line_str = ''.join(line_list)f2.write(line_str)i += 1line2_list = list(f1_list[i])line2_list[0] = ''line2_list[-12] = '};'line2_str = ''.join(line2_list)f2.write(line2_str)f2.write('\n')if lines_of_each_character == 1:for i in range(lines_num_of_index + 1, len(f1_list) - 1, lines_of_each_character):if character_num < 10:f2.write(f'const unsigned char hz_{character_num} PROGMEM[] = \n')character_num += 1line_list = list(f1_list[i])line_list[-11] = '};'line_str = ''.join(line_list)f2.write(line_str)f2.write('\n')elif 10 <= character_num < 100:f2.write(f'const unsigned char hz_{character_num} PROGMEM[] = \n')character_num += 1line_list = list(f1_list[i])line_list[-12] = '};'line_str = ''.join(line_list)f2.write(line_str)f2.write('\n')f2.write('\n\n')f2.write('struct FNT_HZ // 漢字字模數據結構\n{\n')f2.write('\tchar Index[4]; ')f2.write('// 漢字內碼索引,存放內碼,如"中",在UTF-8編碼下,每個漢字占3個字節,第四個是結束符0\n')f2.write('\tconst unsigned char* hz_Id; // 點陣碼數據 存放內碼后對應的 點陣序列 每個字需要32個字節的點陣序列\n')f2.write('\tunsigned char hz_heitht;\n')f2.write('\tunsigned char hz_width;\n};')f2.write('\n\n\n')f2.write('PROGMEM const FNT_HZ hanzi[] =\n{\n')if len(index_list) <= 20:for j in range(int(len(index_list) / 2)):# print(index_list[j * 2], index_list[j * 2 + 1])f2.write('\t{')f2.write(f'"{index_list[j * 2]}", hz_{index_list[j * 2 + 1]}, {font_height}, {font_width}')f2.write('},\n')if 20 < len(index_list) <= 290:for j in range(10):# print(index_list[j * 2], index_list[j * 2 + 1])f2.write('\t{')f2.write(f'"{index_list[j * 2]}", hz_{index_list[j * 2 + 1]}, {font_height}, {font_width}')f2.write('},\n')for j in range(10, int((len(index_list) - 20) / 3) + 10):# print(index_list[(j - 10) * 3 + 20], index_list[(j - 10) * 3 + 21] + index_list[(j - 10) * 3 + 22])f2.write('\t{')f2.write(f'"{index_list[(j - 10) * 3 + 20]}", ')f2.write(f'hz_{index_list[(j - 10) * 3 + 21] + index_list[(j - 10) * 3 + 22]}, {font_height}, {font_width}')f2.write('},\n')f2.write('};')with open('./Function.h', 'w', encoding='utf-8') as f3:f3.write('/*******************單個漢字顯示****************/\n')f3.write('void showMyFont(int32_t x, int32_t y, const char c[3], uint32_t color) {\n')f3.write(f'\tfor (int k = 0; k < {character_num}; k++)// 根據字庫的字數調節循環的次數\n')f3.write('\t\tif (hanzi[k].Index[0] == c[0] && hanzi[k].Index[1] == c[1] && hanzi[k].Index[2] == c[2]) {\n')f3.write('\t\t\ttft.drawBitmap(x, y, hanzi[k].hz_Id, hanzi[k].hz_width, hanzi[k].hz_heitht, color);')f3.write('\n\t}\n}')

代碼將生成Font.h與Function.h兩個文件
Function.h中的函數可以在TFT屏幕上顯示單個漢字

/*******************單個漢字顯示****************/ void showMyFont(int32_t x, int32_t y, const char c[3], uint32_t color) {for (int k = 0; k < 8; k++)// 根據字庫的字數調節循環的次數if (hanzi[k].Index[0] == c[0] && hanzi[k].Index[1] == c[1] && hanzi[k].Index[2] == c[2]) {tft.drawBitmap(x, y, hanzi[k].hz_Id, hanzi[k].hz_width, hanzi[k].hz_heitht, color);} }

以下函數顯示多個漢字

/*******************整句漢字顯示****************/ //顯示整句漢字,字庫比較簡單,上下、左右輸出是在函數內實現 //參數說明: //x,y顯示位置 str為輸入字符串 mode 0為水平,1為豎直 enable_auto_change_line自動換行 void showMyFonts(int32_t x, int32_t y, const char str[], uint32_t color, char mode, bool enable_auto_change_line) {int x0 = x;int y0 = y;if (mode == 0) {for (int i = 0; i < strlen(str); i += 3) {if (enable_auto_change_line) {if (x0 + hanzi[0].hz_width >= TFT_WIDTH) {x0 = 0;y0 = y0 + hanzi[0].hz_heitht;}}showMyFont(x0, y0, str + i, color);x0 += hanzi[0].hz_width;}}if (mode == 1) {for (int i = 0; i < strlen(str); i += 3) {if (enable_auto_change_line) {if (y0 + hanzi[0].hz_heitht >= TFT_HEIGHT) {y0 = 0;x0 = x0 + hanzi[0].hz_width;}}showMyFont(x0, y0, str + i, color);y0 += hanzi[0].hz_heitht;}} }

總結

以上是生活随笔為你收集整理的PCtoLCD2002 生成字模转换为字库 .h文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。