获取TTF里面的字体名称
来源:互联网 发布:下载打印机软件 编辑:程序博客网 时间:2024/04/27 09:10
网上有个Java版本的,我拿过来改了个C#版的,废话不多说,直接上代码
public class TTFParser { public static int COPYRIGHT = 0; public static int FAMILY_NAME = 1; public static int FONT_SUBFAMILY_NAME = 2; public static int UNIQUE_FONT_IDENTIFIER = 3; public static int FULL_FONT_NAME = 4; public static int VERSION = 5; public static int POSTSCRIPT_NAME = 6; public static int TRADEMARK = 7; public static int MANUFACTURER = 8; public static int DESIGNER = 9; public static int DESCRIPTION = 10; public static int URL_VENDOR = 11; public static int URL_DESIGNER = 12; public static int LICENSE_DESCRIPTION = 13; public static int LICENSE_INFO_URL = 14; private Dictionary<int, string> fontProperties = new Dictionary<int, string>(); /** * 获取ttf font name * @return */ public string FontName { get { if (fontProperties.ContainsKey(FULL_FONT_NAME)) { return fontProperties[FULL_FONT_NAME]; } else if (fontProperties.ContainsKey(FAMILY_NAME)) { return fontProperties[FAMILY_NAME]; } else { return null; } } } /** * 获取ttf属性 * @param nameID 属性标记,见静态变量 * @return 属性值 */ public string GetFontPropertie(int nameID) { if (fontProperties.ContainsKey(nameID)) { return fontProperties[nameID]; } else { return null; } } /** * 获取ttf属性集合 * @return 属性集合(Dictionary) */ public Dictionary<int, string> FontProperties { get { return fontProperties; } } /** * 执行解析 * @param fileName ttf文件名 * @throws IOException */ public void Parse(string fileName) { fontProperties.Clear(); FileStream f = null; f = new FileStream(fileName, FileMode.Open, FileAccess.Read); ParseInner(f); f.Close(); } private short ReadShort(FileStream stream) { byte[] buffer = new byte[2]; if (stream.Read(buffer, 0, buffer.Length) < buffer.Length) return -1; return (short)(buffer[0] << 8 | buffer[1]); } private int ReadInt(FileStream stream) { byte[] buffer = new byte[4]; if (stream.Read(buffer, 0, buffer.Length) < buffer.Length) return -1; return (int)(buffer[0] << 24 | buffer[1] << 16 | buffer[2] << 8 | buffer[3]); } private void ParseInner(FileStream stream) { int majorVersion = ReadShort(stream); int minorVersion = ReadShort(stream); int numOfTables = ReadShort(stream); if (majorVersion != 1 || minorVersion != 0) { return; } // jump to TableDirectory struct stream.Seek(12, SeekOrigin.Begin); bool found = false; byte[] buff = new byte[4]; TableDirectory tableDirectory = new TableDirectory(); for (int i = 0; i < numOfTables; i++) { stream.Read(buff, 0, buff.Length); tableDirectory.name = Encoding.Default.GetString(buff); tableDirectory.checkSum = ReadInt(stream); tableDirectory.offset = ReadInt(stream); tableDirectory.length = ReadInt(stream); if ("name".Equals(tableDirectory.name, StringComparison.CurrentCultureIgnoreCase)) { found = true; break; } else if (tableDirectory.name == null || tableDirectory.name.Length == 0) { break; } } // not found table of name if (!found) { return; } stream.Seek(tableDirectory.offset, SeekOrigin.Begin); NameTableHeader nameTableHeader = new NameTableHeader(); nameTableHeader.fSelector = ReadShort(stream); nameTableHeader.nRCount = ReadShort(stream); nameTableHeader.storageOffset = ReadShort(stream); NameRecord nameRecord = new NameRecord(); for (int i = 0; i < nameTableHeader.nRCount; i++) { nameRecord.platformID = ReadShort(stream); nameRecord.encodingID = ReadShort(stream); nameRecord.languageID = ReadShort(stream); nameRecord.nameID = ReadShort(stream); nameRecord.stringLength = ReadShort(stream); nameRecord.stringOffset = ReadShort(stream); long pos = stream.Position; byte[] bf = new byte[nameRecord.stringLength]; long vpos = tableDirectory.offset + nameRecord.stringOffset + nameTableHeader.storageOffset; stream.Seek(vpos, SeekOrigin.Begin); stream.Read(bf, 0, bf.Length); string temp = Encoding.BigEndianUnicode.GetString(bf); if (fontProperties.ContainsKey(nameRecord.nameID)) fontProperties[nameRecord.nameID] = temp; else fontProperties.Add(nameRecord.nameID, temp); stream.Seek(pos, SeekOrigin.Begin); } } public override string ToString() { return fontProperties.ToString(); } private class TableDirectory { public string name; //table name public int checkSum; //Check sum public int offset; //Offset from beginning of file public int length; //length of the table in bytes public override string ToString() { return name; } } private class NameTableHeader { public int fSelector; //format selector. Always 0 public int nRCount; //Name Records count public int storageOffset; //Offset for strings storage, } private class NameRecord { public int platformID; public int encodingID; public int languageID; public int nameID; public int stringLength; public int stringOffset; //from start of storage area public override string ToString() { return nameID.ToString(); } } }
0 0
- 获取TTF里面的字体名称
- [TTF字体]获取TTF字体的点阵信息
- 获取TTF文件的字体名
- 获取TTF文件的字体名
- 【TTF字体】获取TTF字符轮廓
- 如何在android环境下进行ttf解析,通过获取文件头信息得到字体名称!
- [TTF字体]提取TTF字体的轮廓(一)
- [TTF字体]提取TTF字体的轮廓(二)
- 制作TTF格式的字体
- Android ttf字体的使用
- stb_truetype解析ttf字体获取顶点信息
- Mac上多种字体名称的获取
- 获取系统所有安装的字体名称
- TTF字体
- 【TTF字体】TTF字体结构
- 获取iPhone里面的可用字体
- 获取系统里面的所有字体
- 从ttf原始文件解析出字体名称时遇到的字节序的问题是big endian
- Fragment的一些介绍
- SVN 自动部署到开发环境
- strong weak assign copy等修饰词什么时候用
- UI控件--CheckBox
- 农民讲习所——通用程序设计
- 获取TTF里面的字体名称
- MySQL TEXT数据的长度
- MYsql 索引
- 【追求进步】变态跳台阶
- 网口编号
- 背景图片剪裁之background-size
- 名字修饰约定extern "C"与extern "C++"浅析
- mac下android-ndk-r10e-darwin-x86_64.bin解压
- CGI与Servlet的比较