2011-02-02 28 views
2

従来のASP.NETのアプリケーションをAzureに移植しようとしていますが、フォントの問題が発生しています。特定の非標準フォントで描画されたテキストでイメージをレンダリングするコンポーネントがあります(フォント "Water"を呼び出すことができます)。.NET PrivateFontCollection - 異なるスタイルのフォントを読み込みます

水は、それぞれ異なるスタイルを表すいくつかの異なるTTFファイルとして存在します。 「Water Black」、「Water Light」、「Water Regular」、「Water Ultralight」などのスタイルをカバーする合計12種類のTTFファイルがあります。

ASP.NETでは、フォントをWindowsディレクトリにインストールしてからコードを呼び出してインストールします。

Font _fontMedium = new Font("Water Medium", iFontMedium, FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); 

ただし、Azureでは独自のフォントをインストールすることはできません。したがって、これらのフォントをイメージ上に描画するには、アプリケーションでコンテンツとしてフォントファイルをアップロードし、PrivateFontCollectionクラスを使用して個別にロードする必要があります。

私の現在のコードはこれです:「水」:

 PrivateFontCollection fontcollection = new PrivateFontCollection(); 
     string fontpath = string.Concat(System.Web.HttpContext.Current.Request.PhysicalApplicationPath + "assets\\"); 
     fontcollection.AddFontFile(string.Concat(fontpath,"water-bold-webfont.ttf")); 
     fontcollection.AddFontFile(string.Concat(fontpath, "water-ultralight-webfont.ttf")); 
     fontcollection.AddFontFile(string.Concat(fontpath, "water-medium-webfont.ttf")); 
     FontFamily[] privatefontfamilies = fontcollection.Families; 


     Font _fontMedium = new Font("Water Medium", iFontMedium, FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); 
     Font _fontSmall = new Font("Water UltraLight", iFontSmall, System.Drawing.GraphicsUnit.Pixel); 
     Font _fontMini = new Font("Water Bold", iFontMini, System.Drawing.GraphicsUnit.Pixel); 

私が持っている問題は、フォントファイルが追加された後に解除した後、fontcollection.Familiesコレクションで唯一の家族であるということです。

同様に、フォントオブジェクトが宣言された後、ファミリのデフォルトはMicrosoft Sans-Serifになります。私が代わりに使用する場合:

"Water"ファミリでフォントが読み込まれますが、スタイルを適切に選択できないようです。フォントスタイルのための私の唯一のオプションは、ロードしようとしているフォントスタイルすべてを網羅していないFontStyle enumで定義されたものです。

要するに、特定のフォントと利用可能なすべてのスタイルが個別のTTFファイルにロードされている場合、それらをPrivateFontCollectionにロードして個別に使用する方法はありますか?

+0

あなたはかなり固執しています。 FontStyleは、大胆さのさま​​ざまなバリエーションの中から選択するのに十分な洗練されたものではありません。また、GDI +は、compatファミリ名を生成するほど洗練されていません。あなたはこの仕事をすることはできません。 –

+2

1.3 SDK(管理者権限とスタートアップタスク)を追加することで、ロールにフォントをインストールできるようになりました。 –

+2

私はそれがハックだと知っていますが、ttfファイルごとにPrivateFontCollectionのインスタンスを作成できます。適切なものを選択する必要がありますが、少なくともそれは回避策です。 –

答えて

0

私はこれに対する答えがあります。 PrivateFontCollectionを動作させようとしばらくして苦労しましたが、GDIはそれを持たないでしょう。

AddFontResourceのようなネイティブなWin32関数を調べて、何かできるかどうかを調べ始めました。私は最終的にあなたがする必要があることは、パッケージの内容としてTTFフォントファイルをパッケージ化し、それを登録するために各フォントの "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Fonts"にレジストリエントリを追加してからレジストリキーに付けた名前で新しいFontを作成することができます。要するに

AddFont("Water (TrueType)", string.Concat(fontpath, "Water-Black.ttf")); 

Font myfont = new Font("Water Black",16f); 

private void AddFont(string fontname, string path) { 
    Registry.SetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", fontname, path, RegistryValueKind.String); 
} 

これはDEVに大きな動作しているようですが、私は、ステージングのテストを行って、戻って報告します。上記のコードを参照

+0

私はあまりにも早く話しました。レジストリを変更できないため、これはAzureでは機能しません。 – growse

0

、あなたは...

Font _fontMedium = 
    new Font(privatefontfamilies[0] , iFontMedium, FontStyle.Regular, 
      System.Drawing.GraphicsUnit.Pixel); 

代わりのフォント名の文字列でフォントをparametizingを試みることができます。

Microsoftは(出典:MSDN):言う

、Fontコンストラクタに渡される最初の引数はフォントファミリ 名です(ないのfontFamilyオブジェクト フォントコンストラクタの他のバリエーションの場合のように)

私はこれが間違っている(とうまくいかない)と苦労しました! fontfamilyの名前を使って、あなたが作成したいフォントは、あなたが上に書いたようなものに置き換えられます。パラメータとしてfontfamily-objectを使用すると、うまく動作します(私にとって)。

関連する問題