2012-01-23 3 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