在.net中获取字体信息

时间:2009-09-22 14:33:13

标签: .net vb.net fonts

我想知道是否有人知道如何以编程方式从真实字体中获取版本和版权细节。如果您在资源管理器中打开它以及预览,您将在Windows字体查看器中获取此信息。我看过Logfont结构,但信息似乎不在这里

干杯 路加

1 个答案:

答案 0 :(得分:2)

几年前我不得不为一个工作项目做这件事。我不能发布这是专有的,但TT字体的规格是here

我为偏移表,名称记录,名称表头和表目录元素编写了类,这样每个类都有一个静态的FromStream方法。

我还写了一个名为BigEndianReader的实用程序类来处理从大端有序流中读取数据的内容,我很乐意将其放在这里以使您的生活更轻松:

public class BigEndianReader
{
    public static bool Read(Stream stm, out uint i)
    {
        int bhihi = stm.ReadByte();
        if (bhihi == -1)
        {
            i = 0;
            return false;
        }
        int bhi = stm.ReadByte();
        if (bhi == -1)
        {
            i = 0;
            return false;
        }
        int blo = stm.ReadByte();
        if (blo == -1)
        {
            i = 0;
            return false;
        }
        int blolo = stm.ReadByte();
        if (blolo == -1)
        {
            i = 0;
            return false;
        }
        i = (uint)((bhihi << 24) | (bhi << 16) | (blo << 8) | blolo);
        return true;
    }

    public static bool Read(Stream stm, out int i)
    {
        int bhihi = stm.ReadByte();
        if (bhihi == -1)
        {
            i = 0;
            return false;
        }
        int bhi = stm.ReadByte();
        if (bhi == -1)
        {
            i = 0;
            return false;
        }
        int blo = stm.ReadByte();
        if (blo == -1)
        {
            i = 0;
            return false;
        }
        int blolo = stm.ReadByte();
        if (blolo == -1)
        {
            i = 0;
            return false;
        }
        i = ((bhihi << 24) | (bhi << 16) | (blo << 8) | blolo);
        return true;
    }


    public static bool Read(Stream stm, out ushort s)
    {
        int bhi = stm.ReadByte();
        if (bhi == -1)
        {
            s = 0;
            return false;
        }
        int blo = stm.ReadByte();
        if (blo == -1)
        {
            s = 0;
            return false;
        }
        s = (ushort)(((bhi << 8) | blo) & 0xffff);
        return true;
    }

    public static bool Read(Stream stm, out short s)
    {
        int bhi = stm.ReadByte();
        if (bhi == -1)
        {
            s = 0;
            return false;
        }
        int blo = stm.ReadByte();
        if (blo == -1)
        {
            s = 0;
            return false;
        }
        s = (short)(((bhi << 8) | blo) & 0xffff);
        return true;
    }
}

这不是特别优雅,但它很容易使用:

int val;

if (!BigEndianReader.Read(stm, out val))
    throw new SomeErrorOfSomeKind();

我想如果你足够关心你可以在Stream上制作所有的扩展方法,然后你就可以阅读:

int val;

if(!stm.BERead(out val)) // BE prefix for Big Endian
    throw new SomeErrorOfSomeKind();