2012-01-23 14 views
0

Windowsフォントを使用してテキストのアウトラインの各頂点の位置を取得する方法はありますか?Windowsでのテキストのポリゴンアウトラインの頂点位置の取得

テキストとフォントを送信するアルゴリズムが必要です。テキストの各文字の頂点座標を取得します。

+0

あなたはどの言語を使用していますか? C#では、すべての文字で 'Graphics.MeasureString'を使用しようとすることができますが、文字間に空白のピクセルを計算する方法を想像しません。 – Marco

+0

@Marco、どの言語も歓迎します。私が興味を持っているのは、Windows API関数またはフォント情報を読み取る.NET Frameworkメソッドです。 MeasureStringは、テキストが画面内で占める領域を返します。私が必要とするのは、導入したテキストの各文字の頂点座標です。 – Michelle

+0

これにはGDIパスを使用できます。 'BeginPath' +' TextOut' + 'EndPath'を呼び出してテキストのアウトラインからパスを作成します。次に 'GetPath'を使ってパス座標を読み込みます。オプションで 'FlattenPath'を呼び出して曲線を直線に変換することができます。 –

答えて

0

回答がhttp://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/f50d43fe-8206-40e5-98da-6c60630b5f73であるかどうかわかりませんが、一見してください。
私はあなたの問題を解決することができ、コードの一部をポスト:

public struct GLYPHMETRICS 
{ 
    public uint gmBlackBoxX; 
    public uint gmBlackBoxY; 
    public Point gmptGlyphOrigin; 
    public short gmCellIncX; 
    public short gmCellIncY; 
} 
public struct FIXED 
{ 
    public ushort fract; 
    public short value; 
} 
public struct MAT2 
{ 
    public FIXED eM11; 
    public FIXED eM12; 
    public FIXED eM21; 
    public FIXED eM22; 
} 

[DllImport("gdi32.dll")] 
static extern uint GetGlyphOutline(IntPtr hdc, uint uChar, uint uFormat, 
    out GLYPHMETRICS lpgm, uint cbBuffer, IntPtr lpvBuffer, ref MAT2 lpmat2); 




public static bool GetGlyphShape(Font font, Char c, out GLYPHMETRICS metrics) 
{ 
    metrics = new GLYPHMETRICS(); 
    MAT2 matrix = new MAT2(); 
    matrix.eM11.value = 1; 
    matrix.eM12.value = 0; 
    matrix.eM21.value = 0; 
    matrix.eM22.value = 1; 

    using (Bitmap b = new Bitmap(1, 1)) 
    { 
     using (Graphics g = Graphics.FromImage(b)) 
     { 
      IntPtr hdc = g.GetHdc(); 
      IntPtr prev = SelectObject(hdc, font.ToHfont()); 
      int bufferSize = (int)GetGlyphOutline(
       hdc, (uint)c, (uint)2, out metrics, 0, 
       IntPtr.Zero, ref matrix); 
      IntPtr buffer = Marshal.AllocHGlobal(bufferSize); 
      bool retval = false; 
      try 
      { 
       retval = GetGlyphOutline(hdc, (uint)c, (uint)2, 
         out metrics, (uint)bufferSize, 
         buffer, ref matrix) > 0; 

       g.ReleaseHdc(hdc); 
      } 
      catch { retval = false; } 
      finally 
      { 
       Marshal.FreeHGlobal(buffer); 
      } 
      return retval; 
     } 
    } 
} 
0

Uはこのために任意の3Dモデリングソフトウェアを使用することができます。たとえば、ブレンダーは、テキストオブジェクトを作成し、obj形式ファイルをエクスポートするための優れたサポートを持っています。これは簡単なメモ帳で開くことができます。ここでは、必要な文字のすべての頂点を取得できます。

+0

しかし一方で、多くの頂点が存在します。したがって、すべてのフォントを読み込むのに時間がかかるでしょう。 – anurag

関連する問題