在PHP開發中,載入字型檔案是常見的需求。然而,為了確保字體檔案的可用性和方便性,我們可能會考慮將字體檔案嵌入到建置的二進位檔案中。這樣一來,我們就不再需要依賴外部的字體文件,而是直接在程式碼中使用嵌入的字體。那麼,如何實現字體檔案的嵌入呢?本文將為您詳細解答。
我的 go 套件中有這段程式碼。它必須載入 cmr10.ttf
字型檔。因此,字型檔案必須位於使用此套件的每個可執行檔旁邊。
import ( "github.com/deadsy/sdfx/sdf" ) func Text(txt string, height, thickness, roundness float32) (sdf.SDF3, error) { f, err := sdf.LoadFont("cmr10.ttf") if err != nil { return nil, err } t := sdf.NewText(txt) s2d, err := sdf.TextSDF2(f, t, float64(height)) if err != nil { return nil, err } // Extrude the 2D SDF to a 3D SDF. return sdf.ExtrudeRounded3D(s2d, float64(thickness), float64(roundness)) }
有沒有辦法避免使用此套件將 cmr10.ttf
字型檔案複製到任何執行檔旁邊?
例如,將字型檔案嵌入到建置的二進位檔案中。如果可以的話具體怎麼做?
還有其他可以嘗試的想法嗎?
從 go 1.16 開始,go 工具支援將靜態檔案直接嵌入可執行二進位檔案中。您可以使用 //go:embed
指令嵌入字型檔案的二進位資料:
import ( _ "embed" ) //go:embed cmr10.ttf var cmr10fontdata []byte
cmr10.ttf
的內容將被編譯器插入到 cmr10fontdata
變數中。有關其他選項,請參閱 在 go 程式中捆綁靜態資源的最佳方式是什麼?
現在由於github.com/deadsy/sdfx/sdf
只提供sdf.loadfont(fname)
輔助函數,您必須使用github.com/golang/freetype/truetype
解析字型資料。請注意, sdf.loadfont()
也在幕後使用此方法,呼叫 truetype.parse()
與字體檔案的二進位資料:
f, err := truetype.Parse(cmr10FontData) // Check error // use f if no error
以上是程式碼必須載入字型文件,如何嵌入到建置的二進位檔案中的詳細內容。更多資訊請關注PHP中文網其他相關文章!