获取图片文件的属性,一般都是通过读取图片文件的字节流的方式,分析图片文件的文件头信息来得到的。因为图片的宽度、高度、大小等信息就是按照一定的格式存放在文件头里的。具体图片的文件头格式可查看相关图片的标准文档,这在网上是不难找到的。图片的属性信息就存于文件头的字节流的某个位置,只要找到这个位置,把它读取出来,就行了。如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:wizwolf@126.com
' 程序开发: 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") '图片大小
'=================================================
%>