獲取圖片文件的屬性,一般都是通過讀取圖片文件的字節流的方式,分析圖片文件的文件頭信息來得到的。因爲圖片的寬度、高度、大小等信息就是按照一定的格式存放在文件頭裏的。具體圖片的文件頭格式可查看相關圖片的標準文檔,這在網上是不難找到的。圖片的屬性信息就存於文件頭的字節流的某個位置,只要找到這個位置,把它讀取出來,就行了。如GIF文件的第八個節的位置是高度。具體實現步驟如下:
首先分析文件頭的字節流,得到圖片的真實格式。
然後根據圖片的格式,進一步分析文件頭的字節流,得到圖片的寬度、高度、大小等信息。
下面是用VBS腳本編寫的一個類,這個類能獲取圖片的寬度、高度、類型、大小和標記。
由於這個類是讀取圖片文件夾的二進制字節流,來獲取圖片的格式的,所以用也能用這個類判斷圖像文件的真實格式。
這個類目前支持JPG(JFIF EXIF)、GIF、PNG、BMP幾種格式的圖像,網上也有好多這樣的類,但大多不支持EXIF格式的JPG文件,而這個類是支持EXIF的。
由於這個類支兩種JPG格式,既標準的JFIF和擴展的用於數碼相機等設備的EXIF格式。所以能識別數碼相機導出的JPG圖像文件。網上大多數的讀取圖片屬性的類是不支持這個的,所以會出現一些奇怪的錯誤或是文件格式不識別的錯誤。
VBS源碼:
<%
'=================================================
' Wizwolf Infomation About Images 1.0
' ?005-2006 Developed by Wizwolf. www.wizwolf.com
'=================================================
' 版權聲明
' 版權所有: Wizwolf Email:[email protected]
' 程序開發: Song GuangZhe
' 許可協議: 未經授權,即可擅自使用使用、複製和修改
' 程序功能: 獲取圖片寬度、高度、類型、標誌和大小的類,支持JPG(JFIF EXIF)、GIF、PNG、BMP
'=================================================
Class CImageAttribute
Private imgInfo
Private imgStream
Private imgType
Private imgMark
Private imgHeight
Private imgWidth
Private imgDepth
Private imgSize
''初始化類
Private Sub Class_Initialize()
Set imgInfo = server.CreateObject("Scripting.Dictionary")
Set imgStream = Server.CreateObject("ADODB.Stream")
imgStream.Mode = 3
imgStream.Type = 1
imgStream.Open
End Sub
Public Function OpenImageInfo(ImageFile)
If Not IsNull(ImageFile) Then
imgStream.LoadFromFile(ImageFile)
imgSize = imgStream.Size
CheckImageType
imgInfo.Add "Type",imgType
imgInfo.Add "Mark",imgMark
imgInfo.Add "Height",imgHeight
imgInfo.Add "Width",imgWidth
imgInfo.Add "Size",imgSize
Set OpenImageInfo = imgInfo
Else
Set OpenImageInfo = Null
End If
End Function
''
Private Function CheckImageType()
Dim M
imgStream.Position = 0
M = Hex(BinValM(imgStream.Read(2)))
If M = "FFD8" Then
imgType = "JPG"
AnalyseJPG
End If
If M = "424D" Then
imgType = "BMP"
AnalyseBMP
End If
imgStream.Position = 0
M = Hex(BinValM(imgStream.Read(3)))
If M = "474946" Then
imgType = "GIF"
AnalyseGIF
End If
imgStream.Position = 0
imgStream.Read(1)
M = Hex(BinValM(imgStream.Read(3)))
If M = "504E47" Then
imgType = "PNG"
AnalysePNG
End If
End Function
''
Private Function AnalyseJPG()
imgStream.Position = 0
Dim p,q,l
Do While Not imgStream.EOS
p = BinToHex(imgStream.Read(1))
If p = "FF" Then
q = BinToHex(imgStream.Read(1))
Select Case q
Case "E0":
l = BinValM(imgStream.Read(2))
imgMark = BinToStr(imgStream.Read(4))
imgStream.Read(l-2-4)
Case "E1":
l = BinValM(imgStream.Read(2))
imgMark = BinToStr(imgStream.Read(4))
imgStream.Read(l-2-4)
Case "C0":
l = BinValM(imgStream.Read(2))
imgStream.Read(1)
imgHeight = BinValM(imgStream.Read(2))
imgWidth = BinValM(imgStream.Read(2))
imgStream.Read(l-2-1-2-2)
Exit do
Case "DB":
l = BinValM(imgStream.Read(2))
imgStream.Read(l-2)
Case "C1":
l = BinValM(imgStream.Read(2))
imgStream.Read(l-2)
Case "C4":
l = BinValM(imgStream.Read(2))
imgStream.Read(l-2)
Case "DA":
l = BinValM(imgStream.Read(2))
imgStream.Read(l-2)
Case "D9":
Exit do
Case Else:
End Select
End If
Loop
End Function
Private Function AnalyseGIF()
imgStream.Position = 0
imgMark = BinToStr(imgStream.Read(6))
imgHeight = BinValI(imgStream.Read(2))
imgWidth = BinValI(imgStream.Read(2))
End Function
Private Function AnalyseBMP()
imgStream.Position = 0
imgMark = BinToStr(imgStream.Read(2))
imgStream.Read(16)
imgHeight = BinValI(imgStream.Read(2))
imgStream.Read(2)
imgWidth = BinValI(imgStream.Read(2))
End Function
Private Function AnalysePNG()
imgStream.Position = 0
imgStream.Read(1)
imgMark = BinToStr(imgStream.Read(3))
imgStream.Read(14)
imgHeight = BinValM(imgStream.Read(2))
imgStream.Read(2)
imgWidth = BinValM(imgStream.Read(2))
End Function
Private Function BinToStr(Bin)
Dim I, Str
For I=1 To LenB(Bin)
clow=MidB(Bin,I,1)
If ASCB(clow)<128 Then
Str = Str & Chr(ASCB(clow))
Else
I=I+1
If I <= LenB(Bin) Then Str = Str & Chr(ASCW(MidB(Bin,I,1)&clow))
End If
Next
BinToStr = Str
End Function
''逆序(little endian)Intel
Private Function BinValI(Bin)
Dim Ret,I
Ret = 0
For I = LenB(Bin) To 1 Step -1
Ret = Ret *256 + AscB(MidB(Bin,I,1))
Next
BinValI=Ret
End Function
''正序(big endian)Motorola
Private Function BinValM(Bin)
Dim Ret,I
Ret = 0
For I = 1 To LenB(Bin)
Ret = Ret *256 + AscB(MidB(Bin,I,1))
Next
BinValM=Ret
End Function
Private Function BinToHex(Binary)
BinToHex = Hex(BinValM(Binary))
End Function
Property Get Info(keyword)
Info = imgInfo.Item(keyword)
End Property
Private Sub Class_Terminate
Set imgInfo = Nothing
imgStream.Close()
Set imgStream = Nothing
End Sub
End Class
'=================================================
'演示
'=================================================
'set im = new CImageAttribute
'Set info1 = im.OpenImageInfo("G:/sgz100.JPG")
'response.Write im.Info("Mark") '標記JIFI、EXIF、PNG、BM、GIF
'response.Write im.Info("Type") '類型JPG、GIF、PNG、BMP
'response.Write im.Info("Height") '圖片高
'response.Write im.Info("Width") '圖片寬
'response.Write info1.Item("Size") '圖片大小
'=================================================
%>