如何在 .NET 中創建子集字型?
我有一個 Silverlight 應用程序,我需要在其中嵌入一些不太常見的字型。我只需複制 TTF/OTF 並用我的應用程序編譯它就足夠簡單了。然而,在許多情況下,實際上只使用了 5-10 個字元。在其他情況下,某些字型檔非常大(例如Arial Unicode MS Regular為 22.1 MB)。我的應用程序的快速下載時間非常重要,因此優化使用的字型至關重要。
所以,我在想的是,我在像 Expression Blend 這樣的應用程序中看到過,其中 a
<Glyph/>用於創建只讀字型,您也可以選擇僅嵌入某些字元。在其他情況下,我看到人們使用僅包含某些字元的字型作為完整字型的子集(而不是<Glyph/>在 Silverlight 中使用 a,而只是將子集 .TTF 用作<FontFamily/>.)。我在之後,除了我沒有使用表達式。我不是在尋找偷偷摸摸的解決方法,比如導出到 XPS 文件並獲取 .odtff 文件。
是否有一種程式方式(.NET/GDI+)來創建僅包含某些字元的字型子集並將其編譯為 .TTF/.OTF?此外,這也需要適用於 .TTC 文件。
本機 API CreateFontPackage可能是您正在尋找的。您可以傳遞一個 TTF 和一個要保留的字元列表。如果你通過
TTFCFP_SUBSETforusSubsetFormat,那麼你會得到一個只有這些字元的工作 TTF。這是一個似乎是工作範常式式碼的執行緒(不幸的是,在 C 中)。
在字型的 WPF 中有靜態和動態連結。這一切都可以在 Blend 中定義。通過字型的靜態連結,只需編譯所需的字元並將其嵌入到您的程序集中。使用動態連結嵌入所有字型集。所以嘗試為選定的字型設置靜態連結並嘗試它是否有效。
UPD
嘗試將以下程式碼添加到您的
.csproj文件中。這裡我們包括 Tahoma 字型。AutoFill 屬性設置為 true 表示我們將在程序集中嵌入控制項中僅使用的字元。標記中的字元集<Charachters/>填充點將這些字元包含到程序集中。所有其他標籤都設置為 false,因為我們不需要它們。<ItemGroup> <BlendEmbeddedFont Include="Fonts\tahoma.ttf"> <IsSystemFont>True</IsSystemFont> <All>False</All> <AutoFill>True</AutoFill> <Characters>dasf</Characters> <Uppercase>False</Uppercase> <Lowercase>False</Lowercase> <Numbers>False</Numbers> <Punctuation>False</Punctuation> </BlendEmbeddedFont> <BlendEmbeddedFont Include="Fonts\tahomabd.ttf"> <IsSystemFont>True</IsSystemFont> <All>False</All> <AutoFill>True</AutoFill> <Characters>dasf</Characters> <Uppercase>False</Uppercase> <Lowercase>False</Lowercase> <Numbers>False</Numbers> <Punctuation>False</Punctuation> </BlendEmbeddedFont> </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildExtensionsPath)\Microsoft\Expression\Blend\3.0\WPF\Microsoft.Expression.Blend.WPF.targets" />