none
グリフのブラックボックスを取得する方法について RRS feed

  • 質問

  • Windows APIのGetGlyphOutline関数のようなフォントのピクセル情報を
    習得できるメソッドはC#にないでしょうか?

    アンマネージドコードは使用できないので、代替できるメソッド等が

    あれば教えていただきたいです。

     

    ●環境

    Visual C#

    WindowsXP SP2

    Visual Studio2005

    .NET Framework 2.0

     

    よろしくお願いいたします。

    2008年2月1日 5:28

回答

  • 外池です。

     

    BlackBoxの意味が、私は詳しくないのでよくわからないのですが、元のご紹介になったAPIの機能から類推するに、境界線の形状が欲しい、ということでしょうか?

     

    そうしますと、Drawing2D名前空間のGraphicsPathクラスが使えるのではないかと。GraphicsPathのAddStringメソッドを使えば、やはり、特定のフォントの特定の文字の、輪郭の形状をオブジェクトとして得ることができます。

     

    この形状について、具体的な数値データ(数値データのフォーマットや意味はまったく理解できませんが、具体的な位置を示すデータと、曲線のパラメータの組み合わせ。2次のベジェ曲線を使用しているものと推察)をPathDataという形で得ることができますし、数値データに関知しなくても、文字の輪郭を表すGraphicsPathのオブジェクトを使って、描画領域のクリッピングを行ったりすることもできます。

     

    たぶん、ビットマップのスキャンについてゴリゴリとコードを書く必要はまったくないかと・・・。

    察するに、GraphicsPathのドキュメントを精読されれば・・・。

     

    -----以下の参考情報を見つけたので追記

     

    http://wisdom.sakura.ne.jp/system/msnet/msnet_win11.html

    2008年2月1日 6:13

すべての返信

  • 外池と申します。

     

    「アンマネージコードが使用できない」(私が勝手に「API呼び出しは使ってはならない」と解釈していますが)ということが譲れない条件だとして、とにかく、ビットマップの状態で特定のフォントの特定の文字の描画イメージが欲しいのであれば・・・、

     

    Bitmapクラスのインスタンスを作って、これを元にGraphicsのFromImageでGraphicsオブジェクトのインスタンスを得て、そして、お望みのフォントと文字でDrawStringしてやればビットマップの情報が得られると思います。

     

    そうすれば、ピクセル情報取り出せますよね?

     

     

     

    2008年2月1日 5:38
  • ジャガビーです。

     

    アドバイスありがとうございます。

    「アンマネージドコードが使用できない」=「API呼び出しは使ったはならない」

    で合っています。大雑把に書いてしまいました。すみません。

     

    やはりDrawStringして、GetPixcelなどでビットマップをスキャンして、

    文字の境界情報(欲しいのはBlackBoxの情報なのですが)を取得するしかないでしょうか。。。

    チャレンジしてみます。

     

     

     

    2008年2月1日 6:06
  • 外池です。

     

    BlackBoxの意味が、私は詳しくないのでよくわからないのですが、元のご紹介になったAPIの機能から類推するに、境界線の形状が欲しい、ということでしょうか?

     

    そうしますと、Drawing2D名前空間のGraphicsPathクラスが使えるのではないかと。GraphicsPathのAddStringメソッドを使えば、やはり、特定のフォントの特定の文字の、輪郭の形状をオブジェクトとして得ることができます。

     

    この形状について、具体的な数値データ(数値データのフォーマットや意味はまったく理解できませんが、具体的な位置を示すデータと、曲線のパラメータの組み合わせ。2次のベジェ曲線を使用しているものと推察)をPathDataという形で得ることができますし、数値データに関知しなくても、文字の輪郭を表すGraphicsPathのオブジェクトを使って、描画領域のクリッピングを行ったりすることもできます。

     

    たぶん、ビットマップのスキャンについてゴリゴリとコードを書く必要はまったくないかと・・・。

    察するに、GraphicsPathのドキュメントを精読されれば・・・。

     

    -----以下の参考情報を見つけたので追記

     

    http://wisdom.sakura.ne.jp/system/msnet/msnet_win11.html

    2008年2月1日 6:13
  • ジャガビーです。

     

    >たぶん、ビットマップのスキャンについてゴリゴリとコードを書く必要はまったくないかと・・・。

    >察するに、GraphicsPathのドキュメントを精読されれば・・・。

    おっしゃる通りでございます。

    この辺のドキュメントをもう一度読み返してみます。

     

    ありがとうございました。

    2008年2月1日 6:42
  •  ジャガビー さんからの引用

    文字の境界情報(欲しいのはBlackBoxの情報なのですが)を取得するしかないでしょうか。。。

     
    すでに書かれているように、GraphiscPath に文字を描画してから GetBounds を呼び出せば、文字を収めるサイズの矩形領域を得ることができます。フォント情報の BlackBox のサイズとは一致しないと思いますが、用途によっては十分な情報を取得できていると思います。
     
    StringFormat の FitBlackBox を指定しておくほうが良いかもしれませんが、GraphicsPath に点座標を使用して1文字だけ AddString した場合、得られる矩形の位置はともかく、サイズはおなじではないかと思います。
    2008年2月1日 7:47