python制作fnt字体打包工具
生活随笔
收集整理的這篇文章主要介紹了
python制作fnt字体打包工具
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
python制作fnt字體打包工具
- 當前fnt打包工具現狀
- 制作fnt配置文件
- 遍歷工具所在目錄下的所有字體文件
當前fnt打包工具現狀
當前打包fnt字體很麻煩,特別是要使用美術字生成字體集的情況,如果有一個工具可以一鍵打包美術字體該多好,此文章主要是參考同事許波的分享來完成,非常感謝。
制作fnt配置文件
根據之前的經驗,咋們知道必須要有配置文件才能編碼對應的圖片,比如:a.png與A.png是不一樣的,但是如果在windows目錄下,這兩個文件是不能同時存在的,也就是如果咋們的美術字中有這兩個文件,咋們得用不同的名字來進行命名,所以需要配置文件,目錄結構如下:
fnt.py中的代碼如下:
運行后可以輸出:
咋們words.ini中的內容如下:
開始讀取這個配置文件
如下是輸出內容:
配置文件保存成功
遍歷工具所在目錄下的所有字體文件
目錄下加入字體文件夾,開始對文件夾中的圖片進行遍歷
需要在python頭部加入庫
improt os遍歷文件夾
def main():# 讀取配置文件readWordIni()# 設定遍歷路徑resourePath = "./"for parent,dirnames,filenames in os.walk(resourePath):print(parent,"||",dirnames,"||",filenames)# dirnames為當前目錄下的文件夾列表,遍歷她for dir_list in dirnames:srcpath = resourePath + dir_listprint("start dir name:",srcpath)# 創建一個輸出目錄output_path_name = srcpath+os.sep+"output"# print(output_path_name)if not os.path.exists(output_path_name):os.makedirs(output_path_name)# 只取第一層break就會再每個字體的目錄下創建output輸出文件夾,開始遍歷字體,如果匹配到字體的命名與配置中的相同,則用對應的配置來取代原有圖片的名字作為id
# 創建轉化列表convert_list=dict()fnt_name = os.path.basename(srcpath)# 存對應的ascii碼list = os.listdir(srcpath)#列出文件夾下所有的目錄與文件for i in range(0,len(list)):basename = list[i]# 判斷是否是pngisPng = basename[-4:]if isPng != ".png":continue# 保存圖片的完整路徑,后面為生成圖片集做準備filename = srcpath+os.sep+basename# 取出文件名font=basename[:basename.rfind(".")]# 查找文件名在配置中是否有相關設定if str(font) in fnt_convert_word :# print("font",font,fnt_convert_word[str(font)])font = fnt_convert_word[str(font)]# 將對應的font(有可能是文件名也有可能是配置的名字)轉化為ascii碼try:ascii_code = ord(font)except TypeError as e:print("font define name:" + font + " error !!")return# 存儲路徑對應的ascii碼convert_list[filename]=ascii_codecontinue開始根據文件的路徑及對應的ascii碼來計算圖片總面積
讀取目錄下所有圖片,計算出其中最大尺寸的圖片,根據max_width與max_height計算出所有圖片所占用的最大圖片尺寸,而對面積求平方根就是相同面積的正方行的邊長
生成fnt數據文件
def saveFntData(fnt_name,fnt_define):# 創建一個文件write_file=open(fnt_name,"w")write_file = codecs.open(fnt_name,"w","utf-8")#face="Arial”,字體為”Arial”# size=32:大小為32像素# bold=0 :不加粗# italic=0:不使用斜體# charset="": charset是編碼字符集,這里沒有填寫值即使用默認,# unicode=0:不使用Unicode# stretchH=100:縱向縮放百分比# smooth=1 :開啟平滑# aa=1:開啟抗鋸齒# padding=0,0,0,0:內邊距,文字與邊框的空隙。# spacing=1,1 :外邊距,就是相臨邊緣的距離。head_msg1="""info face="%s" size=%s bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=2,2 outline=0\n""" % (face,fnt_define["size"])write_file.write(head_msg1)# lineHeight=37:行高,如果遇到換行符時,繪制字的位置坐標的Y值在換行后增加的像素值。# base=28 :字的基本大小# scaleW=512 :圖片大小# scaleH=512:圖片大小# pages=1 :此種字體共用到幾張圖。# packed=0:圖片不壓縮head_msg2 ="""common lineHeight=%s base=%s scaleW=%s scaleH=%s pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0\n""" % (fnt_define["lineHeight"],fnt_define["base"],fnt_define["scaleW"],fnt_define["scaleH"])write_file.write(head_msg2)# //第一頁,文件名稱是”bitmapFontChinese.png”# page id=0 file="bitmapFontChinese.png"head_msg3 = """page id=0 file="%s"\n""" % (fnt_define["file"])write_file.write(head_msg3)# 第四行是當前貼圖中所容納的文字數量head_msg4 = """chars count=%s\n""" % (fnt_define["count"])write_file.write(head_msg4)for i in range(0,int(fnt_define["count"])):data=fnt_define["data"][i]line="char id=%s x=%s y=%s width=%s height=%s xoffset=%s yoffset=%s xadvance=%s page=%s chnl=%s letter=\"%s\"\n" %(data["id"],data["x"],data["y"],data["width"],data["height"],data["xoffset"],data["yoffset"],data["xadvance"],data["page"],data["chnl"],data["letter"])write_file.write(line)保存圖片
def savePng(image_name,convert_list,fnt_define_dic):# 計算圖片的最大尺寸outW=max_width*colCountoutH=max_height*rowCount# 創建輸出圖片toImage = Image.new('RGBA', (outW, outH))# 開始保存圖片index = 0for key in convert_list.keys():fromImage=Image.open(key)item_def = fnt_define_dic[key]toImage.paste(fromImage,( int(item_def["x"]),int(item_def["y"])))toImage.save(image_name)效果如下:
詳情可以參考附件
總結
以上是生活随笔為你收集整理的python制作fnt字体打包工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线性链表java实现_java实现线性单
- 下一篇: STM32——ADC