2011-01-02 13 views
16

これは私を一日中夢中にさせてくれました。フォント名とスタイル(太字/斜体)に基づいてフォントファイル名を取得

名前(この場合はArial)と太字、斜体、またはその両方に基づいて、フォントファイル名(たとえばArial.ttf)を取得する必要があります。これらの情報を使って、私はレンダリングのためにフォントファイルを見つける必要があります。

いくつかのより多くの例:

  • Calibri、太字はcalibrib.ttfに解決します。
  • Calibri、Italicはcalibrii.ttfに解決します。私はCでこれを達成できる方法について

任意のアイデア++(Win32の)

+0

フォントのHFONTハンドルがある場合は、私の[提案されたソリューション]を試すことができます(http://stackoverflow.com/questions/16769758/get-a-font-filename-based-on-the-font-ハンドル-hfont)。あなたがそのフォントを扱っているかどうかの質問が不明なので、私はここに答えを加えたくありませんでした。 –

答えて

10

まず、私の知る限り、それを行うには信頼性の高い方法はありません。

Windows APIは、フォントファミリとマッピングを扱います。フォントファイルではなく、下位レベルで処理されます。また、フォントのファイル名を取得しても、(私が知っている)レンダリング機能はそれを受け入れないので、それで何をしますか?

つまり、論理名からフォントのファイル名を取得するには、レジストリキーHKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fontsを調べることができます。このソリューションの実装はhereです。

+6

私はフォントをレンダリングするためにFreeTypeを使用しているので、フォントファイル名が必要です.FreeTypeはファイル名のみを受け入れます。 – Brad

+1

OSが他の言語の場合、そのマッピングは機能しません。 EnumFontFamiliesExWから取得するファセット名は、OS言語(例:アンゼンサ2006年頃)であり、レジストリ名は常に英語(例:ahn2006-B(TrueType))です。 Microsoftは、顔の名前を実際のフォントファイルにマッピングするときに余分な手順を行うようです。 –

0

解決策の1つは、フォントファイルにアクセスし、名前テーブルから名前を抽出して独自の検索を作成することです(STLマップは簡単な方法です)。 TTFファイル形式の詳細はhereです。

+0

これは私がFreeTypeライブラリでやってきたことです。私は%WINDIR%/ Fontsのすべてのフォントファイルを繰り返しています。そして、その顔の種類を確認し、太字/斜体または両方を確認できます。問題は、Fontsディレクトリに、FreeTypeが読み込みに問題があるファイルが含まれているため、FreeTypeがエラーを吐き出すことになります。 – Brad

1

通常、これはCreateFontIndirectを呼び出してシステムをレンダリングすることで行います。おそらく、この標準的なアプローチを使用できない理由を説明することができます。

2

これはCode Project projectです。 GetWinVer関数はXPで停止するため、Windows 7では正常に動作しません。

1) HKEY_LOCAL_MACHINE \ SOFTWARE \マイクロソフト\ Windowsのから登録し、Windowsのフォントリストを読む:以前の記事へ

1

関連のWindows 7用のケースを追加することは簡単です、これは信頼性の高い方法であると思われますNT \ CurrentVersion \ Fonts \ ここでファイル名と代替ファイルパスを取得します。 フォントの名前は、ユーザーのロケールによって変更できるため、便利ではありません。

2)TrueTypeファイル(.ttf、.ttc、.otf)を読み込みます。 FreeTypeを使用https://www.freetype.org/)。 freetypeライブラリを初期化し、FT_New_Face(ライブラリ、パス、0、&の顔)で顔を読み込みます。

3)FreeTypeを使用してフォントファミリ名を取得します。 FT_Get_Sfnt_Name_Count()およびFT_Get_Sfnt_Name()を使用して文字列テーブルを取得します。 エンコーディングがAnsi、UTF16などであるかどうかを確認する必要があります。一部の文字列は複数の異なる言語とエンコーディングであるためです。

4)OS2のTrueTypeプロパティを取得します。 OS2構造体を取得するには、(TT_OS2 *)FT_Get_Sfnt_Table(face、ft_sfnt_os2)を使用します。 ドキュメントを使用して構造体を解釈するhttps://www.microsoft.com/typography/otspec/os2.htm#fc

5)フォントファイルのパス、ファミリ名、スタイルプロパティなどの情報があります。これらのリストを作成して、フォントファミリとスタイルに基づいてファイルを検索します。