如何获取ttf字体文件的内部信息
硬盘里有很多ttf字体文件,请问下如何才能获取字体内部的信息,比如字体的名称和版本号,哪位朋友知道的指点下,谢谢! 回复 1# iamwonvy
字体还有版本号? 是获取的这个?
#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
For $i = 1 To $FileList
$tOLTM=""
$FontList[$i - 1] = $FileList[$i]
$FontList[$i - 1] = Int(FileGetSize(_WinAPI_ShellGetSpecialFolderPath($CSIDL_FONTS) & "\" & $FileList[$i]) / 1024) & "KB"
$FontList[$i - 1] = _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])
$hSv = _WinAPI_SelectObject($hDC, $hFont)
$tOLTM = _WinAPI_GetOutlineTextMetrics($hDC)
_WinAPI_SelectObject($hDC, $hSv)
_WinAPI_ReleaseDC(0, $hDC)
If IsDllStruct($tOLTM) Then
$FontList[$i-1]=_otm($tOLTM, 'otmFamilyName')
$FontList[$i-1]=_otm($tOLTM, 'otmFaceName')
$FontList[$i-1]=_otm($tOLTM, 'otmStyleName')
$FontList[$i-1]=_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# netegg 回复 5# iamwonvy
貌似你的的字体未复制到FONT目录?
回复 6# 3mile
那不是所有字体都要安装了 呵呵 我再上网找找
看可不可以获取文件的详细信息
详细信息里面有字体的信息 回复 6# 3mile
确实安装了就显示字体名称了 呵呵
不过我还是觉得麻烦 不过谢谢你提供了这个方法 回复 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
For $i = 1 To $FileList
$tOLTM=""
$FontList[$i - 1] = $FileList[$i]
$FontList[$i - 1] = Int(FileGetSize($font_path & "\" & $FileList[$i]) / 1024) & "KB"
_WinAPI_AddFontResourceEx($font_path & "\" & $FileList[$i], $FR_NOT_ENUM)
$FontList[$i - 1] = _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])
$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]=_otm($tOLTM, 'otmFamilyName')
$FontList[$i-1]=_otm($tOLTM, 'otmFaceName')
$FontList[$i-1]=_otm($tOLTM, 'otmStyleName')
$FontList[$i-1]=_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
这个问题还是交给 C 吧。 和c没关系,不注册的话,字体名根本就不会出现,只有指定字体文件临时加载才行,但是这样是不会写到系统的
页:
[1]