トップページ > 過去ログ > 記事閲覧
C# 任意フォントのバイナリでの読み込みについて
名前:ちく 日時: 2012/08/28 20:36

いつも、DXライブラリにはお世話になっております。 さて、この度は、C#にて任意のフォントの読み込みを行う際に問題が生じたので質問させて頂きます。 正規の方法かわかりませんが、通常、C#+DXlibにてフォントデータを読みこませる際は、下記の記述で行なっていました。 ※C#でのフォントの使用 ---------------------------------------------------------- //フィールドにPrivateFontCollectionを用意 private System.Drawing.Text.PrivateFontCollection fontCollection= new System.Drawing.Text.PrivateFontCollection(); //fontCollectionにフォントデータを読み込む (テストで、あずきフォントを利用しています) fontCollection.AddFontFile("azuki.ttf"); //フォントパスを代入 int fontA = DX.CreateFontToHandle("あずきフォント", 6, 2, DX.DX_FONTTYPE_NORMAL, DX.DX_CHARSET_DEFAULT); //fontAを使用 ---------------------------------------------------------- 後に、フォントデータの暗号化が必要となり、 バイナリで読み込めるようにするべく、上記のソースを以下のように改変して使用しました。 ※C#でのフォントのバイナリ読み込みでの使用 ---------------------------------------------------------- //フィールドにPrivateFontCollectionを用意 private System.Drawing.Text.PrivateFontCollection fontCollection= new System.Drawing.Text.PrivateFontCollection(); //fontBufにバイナリデータを入れる (テストで、あずきフォントを利用しています) byte[] fontBuf = System.IO.File.ReadAllBytes("azuki.ttf"); //unsafeにて、ポインタを利用し、fontCollectionにメモリの内容からフォントデータを読み込む unsafe { fixed (byte* pointerFontBuf = fontBuf) { fontCollection.AddMemoryFont((IntPtr)pointerFontBuf, fontBuf.Length); } } //フォントパスを代入 int fontA = DX.CreateFontToHandle("あずきフォント", 6, 2, DX.DX_FONTTYPE_NORMAL, DX.DX_CHARSET_DEFAULT); //fontAを使用 ---------------------------------------------------------- しかし、これで実行してみたところ、fontBufにデータが入るにもかかわらず、 フォントデータの呼び出しが正常に行われませんでした。 また、DXlibから離れて、フォームアプリケーションで試した所、共にフォントが変更されました。 もしよろしければ、何が間違えていたのかご指摘願えればと思います。 よろしくお願いします。

Page: 1 |

Re: C# 任意フォントのバイナリでの読み込みについて ( No.1 )
名前:管理人 日時:2012/09/02 05:16

PrivateFontCollection の AddMemoryFont を使用した場合は何故DXライブラリで使用できないかはわかりませんが、 とりあえずの対処としてメモリに保存されているフォントデータをテンポラリファイルに出力して AddFontFile で 読み込むことで使うことができましたので、よろしければこの方法を使用してみてください byte[] fontBuf = System.IO.File.ReadAllBytes("azuki.ttf"); string name = Path.GetTempFileName(); System.IO.File.WriteAllBytes(name, fontBuf); privateFont.AddFontFile(name);
Re: C# 任意フォントのバイナリでの読み込みについて ( No.2 )
名前:ちく 日時:2012/09/02 11:59

ご返答ありがとう御座います。 やはり、AddMemoryFontとの相性の悪さからか、 テンポラリファイルの手段しか無いのですね。 わかりました。上記の方法を利用させて頂きます。
Re: C# 任意フォントのバイナリでの読み込みについて ( No.3 )
名前:ちく 日時:2012/09/08 22:10

追記です。 管理人様の方法にて、実行可能ではあるものの、 フォントデータが直接さらけ出してしまう上、読み込んだフォントデータに対して、アプリケーションの終了まで、テンポラリファイルの修正等、一切の手出しができません。 やはり、C#にて、何か他の手段で、フォントデータを保護するような手段はありませんでしょうか? よろしくお願いします。
Re: C# 任意フォントのバイナリでの読み込みについて ( No.4 )
名前:管理人 日時:2012/09/09 08:23

C++ で Win32API を使った「メモリ上に展開されたフォントファイルを読み込む」機能を使った場合は ChangeFont で正常に変更することができたので、C# でも同様のAPIを使うようにしてみたところ、上手くいきました その方法ですが、まず「メモリ上に展開されたフォントファイルを読み込むAPI」を使いたいクラスの中で以下の定義を行います ( 二番目のAPIは AddFontMemResourceEx の戻り値である「フォントリソースハンドル」を第一引数に取る「フォントリソースを解放するAPI」です ) [DllImport("gdi32.dll")] extern static IntPtr AddFontMemResourceEx(IntPtr pFileView, uint cjSize, IntPtr pvResrved, IntPtr pNumFonts); [DllImport("gdi32.dll")] extern static int RemoveFontMemResourceEx(IntPtr fh); APIの解説についてはMSDNの解説をご覧になってください AddFontMemResourceEx http://msdn.microsoft.com/ja-jp/library/cc428287.aspx RemoveFontMemResourceEx http://msdn.microsoft.com/ja-jp/library/cc410544.aspx で、フォントを追加する処理はこちらです IntPtr fontResourceHandle; byte[] fileImage = System.IO.File.ReadAllBytes("azuki.ttf"); unsafe { fixed (byte* fileImageP = fileImage) { int fonts = 0; int* fontsP = &fonts; fontResourceHandle = AddFontMemResourceEx((IntPtr)fileImageP, (uint)fileImage.Length, (IntPtr)0, (IntPtr)fontsP); } } ソフトを終了すると読み込んだフォントリソースは自動的に開放されると思いますが、明示的に解放する場合は以下の処理を実行します RemoveFontMemResourceEx( fontResourceHandle ); よろしければ試してみてください
Re: C# 任意フォントのバイナリでの読み込みについて ( No.5 )
名前:ちく(解決) 日時:2012/09/09 12:14

丁重な対応、ありがとう御座います。 上記コードにて、バイナリフォントデータの読み込みが問題なくできました。

Page: 1 |