获取图片文件的属性

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

%>

下载源码: http://www.wizwolf.com/club/ShowPost.asp?id=4

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值