iamwonvy 发表于 2011-12-15 08:36:28

如何获取ttf字体文件的内部信息

硬盘里有很多ttf字体文件,请问下如何才能获取字体内部的信息,
比如字体的名称和版本号,哪位朋友知道的指点下,谢谢!

netegg 发表于 2011-12-15 08:57:26

回复 1# iamwonvy
字体还有版本号?

3mile 发表于 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

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

iamwonvy 发表于 2011-12-15 12:33:03

谢谢三笑 我上网找了很久就是没找到,不过那个有好多字体识别不出来

iamwonvy 发表于 2011-12-15 12:35:51

回复 2# netegg

3mile 发表于 2011-12-15 12:42:30

回复 5# iamwonvy
貌似你的的字体未复制到FONT目录?

iamwonvy 发表于 2011-12-15 12:50:29

回复 6# 3mile

那不是所有字体都要安装了 呵呵 我再上网找找
看可不可以获取文件的详细信息
详细信息里面有字体的信息

iamwonvy 发表于 2011-12-15 13:23:45

回复 6# 3mile


确实安装了就显示字体名称了 呵呵
不过我还是觉得麻烦 不过谢谢你提供了这个方法

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

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

ardin 发表于 2012-1-7 17:35:02

这个问题还是交给 C 吧。

netegg 发表于 2012-1-7 21:58:44

和c没关系,不注册的话,字体名根本就不会出现,只有指定字体文件临时加载才行,但是这样是不会写到系统的
页: [1]
查看完整版本: 如何获取ttf字体文件的内部信息