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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python制作fnt字体打包工具

發布時間:2023/12/20 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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計算出所有圖片所占用的最大圖片尺寸,而對面積求平方根就是相同面積的正方行的邊長

def createFntSet(fnt_name,convert_list,output_path_name):if len(convert_list)>=1 :# 存儲單張圖片的最大高度與最大寬度global max_widthglobal max_heightglobal colCountglobal rowCountmax_height=0max_width=0# 存儲圖片的相關定義fnt_define_item = list()# 存儲圖片的相關定義的字典fnt_define_dic = {}# 遍歷列表中的所有圖片,找到最大寬度與高度for key in convert_list.keys():image = Image.open(key)image_size= image.sizemax_width=max(max_width,image_size[0])max_height=max(max_height,image_size[1])# 存儲數據fnt_define_item_data=dict()fnt_define_item.append(fnt_define_item_data)fnt_define_dic[key] = fnt_define_item_datafnt_define_item_data["id"]=convert_list[key]fnt_define_item_data["width"]=str(image_size[0])fnt_define_item_data["height"]=str(image_size[1])fnt_define_item_data["xoffset"]=str(0)fnt_define_item_data["yoffset"]=str(0)fnt_define_item_data["xadvance"]=str(image_size[0])fnt_define_item_data["page"]=str(0)fnt_define_item_data["chnl"]=str(0)# 去除圖片的ascii轉成字母fnt_define_item_data["letter"]=chr(int(convert_list[key]))# 計算圖片的橫向與縱向的數量totalCount = len(convert_list)# 長*寬是面積,這里算的是最大方塊面積再乘以數量就是總面積,總面積開平方根是指該面積所構成的正方形的邊長# 邊長除以寬度則是數量colCount = int(math.ceil(math.sqrt(max_height*max_width*totalCount*1.0)/max_width))rowCount = int(math.ceil(len(convert_list)*1.0/colCount))print("計算出圖片橫向縱向的數量:",colCount,rowCount)# 圖片的索引,代表當前是處理的第幾張圖片index=0# 上面存儲完圖片的相關數據后,沒有存儲路徑,下面再次計算圖片的位置for key in convert_list.keys():fnt_item_data = fnt_define_dic[key]# 開始計算位置fnt_item_data["x"]=str((index%colCount)*max_width)fnt_item_data["y"]=str(int(index/colCount)*max_height)index += 1fnt_define=dict()fnt_define["data"]=fnt_define_itemfnt_define["size"]=str(max_width)fnt_define["lineHeight"]=str(max_height)fnt_define["base"]=str(max_width)fnt_define["scaleW"]=str(max_width*colCount)fnt_define["scaleH"]=str(max_height*rowCount)image_name=fnt_name+".png"fnt_define["file"]=image_namefnt_define["count"]=len(convert_list)# 保存fnt數據文件fnt_name=output_path_name+"/"+fnt_name+".fnt"saveFntData(fnt_name,fnt_define)# 保存png圖片文件image_name=output_path_name+"/"+image_nameprint("ajdkj",max_width,max_height,colCount)savePng(image_name,convert_list,fnt_define_dic)

生成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字体打包工具的全部內容,希望文章能夠幫你解決所遇到的問題。

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