Получение положения вершин контура многоугольника текста в Windows - PullRequest
0 голосов
/ 24 января 2012

Есть ли способ получить положение каждой вершины контура текста, используя любой шрифт Windows?

Мне нужен алгоритм, в котором я отправляю текст и шрифт и получаю координаты вершин каждого символа в тексте.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2012

U может использовать любое программное обеспечение для 3D-моделирования.Например, blender имеет хорошую поддержку для создания текстовых объектов и экспорта файла формата obj, который можно открыть в простом блокноте.Здесь вы можете получить все вершины нужного вам символа.

0 голосов
/ 24 января 2012

Не знаю, нужен ли вам ответ в 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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...