獲取圖片文件的屬性

  獲取圖片文件的屬性,一般都是通過讀取圖片文件的字節流的方式,分析圖片文件的文件頭信息來得到的。因爲圖片的寬度、高度、大小等信息就是按照一定的格式存放在文件頭裏的。具體圖片的文件頭格式可查看相關圖片的標準文檔,這在網上是不難找到的。圖片的屬性信息就存於文件頭的字節流的某個位置,只要找到這個位置,把它讀取出來,就行了。如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") '圖片大小
'=================================================

%>

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章