找回密码
 加入
搜索
查看: 7179|回复: 10

[系统综合] 如何获取ttf字体文件的内部信息

  [复制链接]
发表于 2011-12-15 08:36:28 | 显示全部楼层 |阅读模式
硬盘里有很多ttf字体文件,请问下如何才能获取字体内部的信息,
比如字体的名称和版本号,哪位朋友知道的指点下,谢谢!
发表于 2011-12-15 08:57:26 | 显示全部楼层
回复 1# iamwonvy
字体还有版本号?
发表于 2011-12-15 09:51:18 | 显示全部楼层
是获取的这个?
#include <Array.au3>
#include <File.au3>
#include <WinAPIEx.au3>
#include <FontConstants.au3>
#include <WinAPIEx.au3>

Global $tOLTM, $tData, $hDC, $hSv, $hFont

Opt('MustDeclareVars', 1)

Global $FileList = _FileListToArray(_WinAPI_ShellGetSpecialFolderPath($CSIDL_FONTS), '*.ttf', 1)
Global $FontList[UBound($FileList) - 1][7]

For $i = 1 To $FileList[0]
        $tOLTM=""
        $FontList[$i - 1][0] = $FileList[$i]
        $FontList[$i - 1][1] = Int(FileGetSize(_WinAPI_ShellGetSpecialFolderPath($CSIDL_FONTS) & "\" & $FileList[$i]) / 1024) & "KB"
        $FontList[$i - 1][2] = _WinAPI_GetFontResourceInfo($FileList[$i], 1)
        
        $hDC = _WinAPI_GetDC(0)
        $hFont = _WinAPI_CreateFont(24, 0, 0, 0, $FW_NORMAL, 0, 0, 0, $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $ANTIALIASED_QUALITY, $DEFAULT_PITCH, $FontList[$i - 1][2])
        $hSv = _WinAPI_SelectObject($hDC, $hFont)
        $tOLTM = _WinAPI_GetOutlineTextMetrics($hDC)        
        _WinAPI_SelectObject($hDC, $hSv)
        _WinAPI_ReleaseDC(0, $hDC)
        
        If IsDllStruct($tOLTM) Then
        $FontList[$i-1][3]=_otm($tOLTM, 'otmFamilyName')
        $FontList[$i-1][4]=_otm($tOLTM, 'otmFaceName')
        $FontList[$i-1][5]=_otm($tOLTM, 'otmStyleName')
        $FontList[$i-1][6]=_otm($tOLTM, 'otmFullName')
        EndIf

Next

_ArrayDisplay($FontList, '_WinAPI_GetFontResourceInfo')


Func _otm(ByRef $tOLTM, $sName)
Return DllStructGetData(DllStructCreate('wchar[' & (_WinAPI_StrLen(DllStructGetPtr($tOLTM) + DllStructGetData($tOLTM, $sName)) + 1) & ']', DllStructGetPtr($tOLTM) + DllStructGetData($tOLTM, $sName)), 1)
EndFunc

评分

参与人数 2金钱 +30 收起 理由
iamwonvy + 10
afan + 20

查看全部评分

 楼主| 发表于 2011-12-15 12:33:03 | 显示全部楼层
谢谢三笑 我上网找了很久就是没找到,不过那个有好多字体识别不出来

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2011-12-15 12:35:51 | 显示全部楼层
回复 2# netegg

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2011-12-15 12:42:30 | 显示全部楼层
回复 5# iamwonvy
貌似你的的字体未复制到FONT目录?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2011-12-15 12:50:29 | 显示全部楼层
回复 6# 3mile

那不是所有字体都要安装了 呵呵 我再上网找找
看可不可以获取文件的详细信息
详细信息里面有字体的信息
 楼主| 发表于 2011-12-15 13:23:45 | 显示全部楼层
回复 6# 3mile


确实  安装了就显示字体名称了 呵呵
不过我还是觉得麻烦 不过谢谢你提供了这个方法
发表于 2011-12-15 13:47:26 | 显示全部楼层
回复 8# iamwonvy
嗯,变通下
#include <Array.au3>
#include <File.au3>
#include <WinAPIEx.au3>
#include <FontConstants.au3>
#include <WinAPI.au3>
 
Global $tOLTM, $tData, $hDC, $hSv, $hFont
 
Opt('MustDeclareVars', 1)

Global $font_path="E:\UNZIPPED\STLF_LSFT"
Global $FileList = _FileListToArray($font_path, '*.ttf', 1)
Global $FontList[UBound($FileList) - 1][7]
 
For $i = 1 To $FileList[0]
        $tOLTM=""
        $FontList[$i - 1][0] = $FileList[$i]
        $FontList[$i - 1][1] = Int(FileGetSize($font_path & "\" & $FileList[$i]) / 1024) & "KB"
                
                _WinAPI_AddFontResourceEx($font_path & "\" & $FileList[$i], $FR_NOT_ENUM)
        $FontList[$i - 1][2] = _WinAPI_GetFontResourceInfo($font_path & "\" & $FileList[$i])
        
        $hDC = _WinAPI_GetDC(0)
        $hFont = _WinAPI_CreateFont(24, 0, 0, 0, $FW_NORMAL, 0, 0, 0, $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $ANTIALIASED_QUALITY, $DEFAULT_PITCH, $FontList[$i - 1][2])
        $hSv = _WinAPI_SelectObject($hDC, $hFont)
        $tOLTM = _WinAPI_GetOutlineTextMetrics($hDC)
                _WinAPI_RemoveFontResourceEx($font_path & "\" & $FileList[$i], $FR_NOT_ENUM)
        _WinAPI_SelectObject($hDC, $hSv)
        _WinAPI_ReleaseDC(0, $hDC)
        
        If IsDllStruct($tOLTM) Then
        $FontList[$i-1][3]=_otm($tOLTM, 'otmFamilyName')
        $FontList[$i-1][4]=_otm($tOLTM, 'otmFaceName')
        $FontList[$i-1][5]=_otm($tOLTM, 'otmStyleName')
        $FontList[$i-1][6]=_otm($tOLTM, 'otmFullName')
        EndIf
 
Next
 
_ArrayDisplay($FontList, '_WinAPI_GetFontResourceInfo')
 
 
Func _otm(ByRef $tOLTM, $sName)
Return DllStructGetData(DllStructCreate('wchar[' & (_WinAPI_StrLen(DllStructGetPtr($tOLTM) + DllStructGetData($tOLTM, $sName)) + 1) & ']', DllStructGetPtr($tOLTM) + DllStructGetData($tOLTM, $sName)), 1)
EndFunc
发表于 2012-1-7 17:35:02 | 显示全部楼层
这个问题还是交给 C 吧。
发表于 2012-1-7 21:58:44 | 显示全部楼层
和c没关系,不注册的话,字体名根本就不会出现,只有指定字体文件临时加载才行,但是这样是不会写到系统的
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-15 13:45 , Processed in 0.085018 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表