2009-09-22 21 views
1

獲取字體信息,我不知道是否有人知道如何以編程方式得到的東西,如版本和版權信息進行True Type字體的。如果你在資源管理器中打開它以及預覽,你可以在Windows字體瀏覽器中獲得這些信息。我看了LOGFONT結構,但信息似乎並不在這裏在.NET

乾杯 盧克

回答

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(); 

我想,如果你關心不夠,你可以讓流本的所有擴展方法,然後你可以將閱讀:

int val; 

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

感謝底座它給了我一個起點 – beakersoft 2009-09-23 11:59:52