你們中許多人可能wondered-我怎麼能擺脫字體或從驅動器中使用像SFML,它需要一個庫時,其他任何單一的文件從文件路徑加載字體。如何使用圖形庫像SFML時嵌入字體和其他圖像文件
所以,我怎麼嵌入數據轉化爲可執行文件,所以生成的可執行文件並不依賴於這些資源文件了嗎?
你們中許多人可能wondered-我怎麼能擺脫字體或從驅動器中使用像SFML,它需要一個庫時,其他任何單一的文件從文件路徑加載字體。如何使用圖形庫像SFML時嵌入字體和其他圖像文件
所以,我怎麼嵌入數據轉化爲可執行文件,所以生成的可執行文件並不依賴於這些資源文件了嗎?
首先,我們必須得到我們的資源。我從谷歌字體下載了「BalooBhaijaan-Regular.ttf」字體。
然後,應該得到給定字體的二進制數據。在我看來,最簡單的方法是使用帶有-i參數的linux「xxd」命令,該參數以C風格陣列輸出。
讓我們輸出重定向到一個文件,因爲它通常會如果我們談論的是True Type字體或更大的圖像長:
xxd -i BalooBhaijaan-Regular.ttf > font_data.txt
創建一個空的C/C++頭或將字體數據成一個已經存在的文件。由於輸出將會很長,我更喜歡使用新的頭文件。
當然,粘貼到IDE後,您可以將數組類型更改爲const,因爲字體的內容通常不會更改。
這就是它在我的IDE中的樣子: 您當然可能想知道爲什麼這是一個char數組 - 只是因爲在char數組中,每個「field」代表一個字節。
正如你可能已經注意到,XXD也爲我們創造另一個變量 - 在font_data.txt最後一個變量是一個unsigned int這告訴我們關於數組的長度。我們稍後需要這個。 「長度-通知」整數的名字是相同的,與「_len」後綴數組的名稱現在
,有兩種方式進行:從使用內置方法存儲器
1.負載字體(一些庫支持它,SFML一樣)
2.創建一個「假」的文件並加載它
讓我們來談談這兩種情況下
1.
這是一個相當簡單的,SFML從內存支持加載文件中給出它的地址和大小,所以我們可以只是這樣做:
#include "BalooBhaijaanFont.hpp"
#include <SFML/Graphics.hpp>
int main(int argc, char** argv) {
sf::RenderWindow mainWindow(sf::VideoMode(200,100), L"TEST");
sf::Font fromMem;
fromMem.loadFromMemory(&BalooBhaijaan_Regular_ttf, BalooBhaijaan_Regular_ttf_len);
sf::Text text("WORKS!", fromMem);
while(mainWindow.isOpen()){
mainWindow.draw(text);
mainWindow.display();
}
return 0;
}
如您所見,使用內建函數加載它非常簡單。
2.
現在是時候了,我真的不建議臨時文件的方法 - 最庫支持從內存中加載,如果你正在製作自己的圖書館,你打算用具有記憶結束無論如何加載函數。
雖然仍然可以創建文件只是爲了讀給一個字體類,然後將其刪除,我不明白,除非你是在你的文件夾中的其他文件非常惱火使用這種方法的任何意義。
僅供參考:
#include "BalooBhaijaanFont.hpp"
#include <SFML/Graphics.hpp>
int main(int argc, char** argv) {
sf::RenderWindow mainWindow(sf::VideoMode(200,100), L"TEST");
sf::Font fromFile;
{
FILE * tempFile = fopen("tmpfont.ttf", "wb");
fwrite(BalooBhaijaan_Regular_ttf, sizeof(char), BalooBhaijaan_Regular_ttf_len, tempFile);
fclose(tempFile);
fromFile.loadFromFile("tmpfont.ttf");
std::remove("tmpfont.ttf");
}
sf::Text text("WORKS!", fromFile);
while(mainWindow.isOpen()){
mainWindow.draw(text);
mainWindow.display();
}
return 0;
}
您不必創建一個臨時文件或緩衝區。只是直接從存儲器讀取使用該字體文件['SF ::字體:: loadFromMemory()'](https://www.sfml-dev.org/documentation/2.4.2/classsf_1_1Font.php#abf2f8d6de31eb4e1db02e061c323e346)。 – Mario
@Mario是不是正是我寫的?我說我不推薦第二種方法,但它仍然有可能 –
啊,我的不好。只是運到代碼。 :) – Mario