December 03, 2020, 08:24:56 PM

Author Topic: [bb] ReadImageInfo() by Marcelo [ 1+ years ago ]  (Read 628 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bb] ReadImageInfo() by Marcelo [ 1+ years ago ]
« on: June 29, 2017, 12:28:43 AM »
Title : ReadImageInfo()
Author : Marcelo
Posted : 1+ years ago

Description : Retrieve information about an image file without loading it, currently it works only on png, bmp and jpg.
Example usage:

Code: [Select]
Info.TImageInfo = ReadImageInfo("teste.png")

DebugLog InfoWidth
DebugLog InfoHeight
DebugLog InfoDepth
DebugLog InfoHasAlpha

Delete Info


Code :
Code: BlitzBasic
  1. ; Image info
  2. Type TImageInfo
  3.         Field Width
  4.         Field Height
  5.         Field Depth
  6.        
  7.         Field HasAlpha
  8. End Type
  9.  
  10. Function ReadImageInfo.TImageInfo(imgfile$)
  11.         imgfile$ = Trim(Lower(imgfile$))
  12.        
  13.         file = ReadFile(imgfile)
  14.         If Not file Then Return Null
  15.        
  16.         Width = 0 : Height = 0 : Depth = 0 : HasAlpha = False
  17.        
  18.         If Instr(imgfile, ".png")
  19.  
  20.                 ; Check signature
  21.                 Sig$ = Chr(137) + "PNG" + Chr(13) + Chr(10) + Chr(26) + Chr(10)
  22.                
  23.                 If ReadByteString(file, Len(Sig)) <> Sig
  24.                         CloseFile(file)
  25.                         Return Null
  26.                 EndIf
  27.                
  28.                 ; Check for valid IHDR chunk
  29.                 Size = Int_SwapEndian(ReadInt(file))
  30.                 Chunk$ = ReadByteString(file, 4)
  31.                 If Chunk <> "IHDR" Or Size <> 13
  32.                         CloseFile(file)
  33.                         Return Null
  34.                 EndIf
  35.                
  36.                 ; Read IHDR chunk
  37.                 Width = Int_SwapEndian(ReadInt(file))
  38.                 Height = Int_SwapEndian(ReadInt(file))
  39.                 Depth = ReadByte(file)
  40.                
  41.                 Col = ReadByte(file)
  42.                
  43.                 Select Col
  44.                         Case 2
  45.                                 Depth = Depth * 3 ; RGB  (red + green + blue)
  46.                                
  47.                         Case 4
  48.                                 Depth = Depth * 2 ; GA   (gray + alpha)
  49.                                 HasAlpha = True
  50.                                
  51.                         Case 5
  52.                                 Depth = Depth * 4 ; ARGB (Alpha + RGB)
  53.                                 HasAlpha = True
  54.                 End Select
  55.                
  56.         Else If Instr(imgfile, ".bmp")
  57.        
  58.                 ; Check for bmp file
  59.                 If ReadByteString(file, 2) <> "BM"
  60.                         CloseFile(file)
  61.                         Return Null
  62.                 EndIf
  63.                
  64.                 ; Some non-used stuff
  65.                 ReadInt(file) ; File size
  66.                 ReadShort(file) ; reserved1
  67.                 ReadShort(file) ; reserved2
  68.                 ReadInt(file)   ; data offset from this point
  69.  
  70.                 Size = ReadInt(file) ; BMPINFO chunk size
  71.                 If Size <> 40
  72.                         CloseFile(file)
  73.                         Return Null
  74.                 EndIf
  75.                
  76.                 Width = ReadInt(file)
  77.                 Height = ReadInt(file)
  78.                
  79.                 ReadShort(file) ; planes
  80.                 Depth = ReadInt(file)
  81.  
  82.         Else If Instr(imgfile, ".jpg")
  83.        
  84.                 ; SOI + APP0
  85.                 Sig$ = Chr($FF) + Chr($D8) + Chr($FF) + Chr($E0)
  86.                
  87.                 If ReadByteString(file, Len(Sig)) <> Sig
  88.                         CloseFile(file)
  89.                         Return Null
  90.                 EndIf
  91.                
  92.                 Size = Short_SwapEndian(ReadShort(file)) - 2
  93.                 Pos = FilePos(file)
  94.                
  95.                 Ident$ = ReadByteString(file)
  96.                 Version = Short_SwapEndian(ReadShort(file))
  97.                
  98.                 ; Check for JFIF version 1.2
  99.                 If (Ident <> "JFIF") Or ( (((Version And $FF00) Shr 8) <> 1) And ((Version And $FF) <> 2) )
  100.                         CloseFile(file)
  101.                         Return Null
  102.                 EndIf
  103.                
  104.                 ; Search for markers
  105.                 SeekFile(file, Pos + Size)
  106.  
  107.                 While Not Eof(file)
  108.                         If ReadByte(file) = $FF
  109.                                 BType = ReadByte(file)
  110.                                 Size = Short_SwapEndian(ReadShort(file)) - 2
  111.                                 Pos = FilePos(file)
  112.                                
  113.                                 ; if the type is from SOF0 to SOF3
  114.                                 If (BType >= $C0) And (BType <= $C3)
  115.                                         Prec = ReadByte(file)
  116.                                        
  117.                                         Height = Short_SwapEndian(ReadShort(file))
  118.                                         Width = Short_SwapEndian(ReadShort(file))
  119.                                        
  120.                                         Exit
  121.                                 EndIf
  122.                                
  123.                                 ; Goto next marker
  124.                                 SeekFile(file, Pos + Size)
  125.                         EndIf          
  126.                 Wend
  127.                
  128.                 Depth = 24     
  129.         EndIf
  130.  
  131.         CloseFile(file)
  132.        
  133.         Info.TImageInfo = New TImageInfo
  134.         InfoWidth = Width
  135.         InfoHeight = Height
  136.         InfoDepth = Depth
  137.         InfoHasAlpha = HasAlpha
  138.        
  139.         Return Info
  140. End Function
  141.  
  142.  
  143.  
  144. ; Utils
  145. Function Int_SwapEndian%(n%)
  146.         Return ((n And $FF) Shl 24) Or ((n And $FF00) Shl 8) Or ((n And $FF0000) Shr 8) Or ((n And $FF000000) Shr 24)
  147. End Function
  148.  
  149. Function Short_SwapEndian%(n%)
  150.         Return ((n And $FF) Shl 8) Or ((n And $FF00) Shr 8)
  151. End Function
  152.  
  153. Function ReadByteString$(file, count = 0)
  154.         Ret$ = ""
  155.        
  156.         If count = 0
  157.                 Char = ReadByte(file)
  158.                 While Char <> 0
  159.                         Ret = Ret + Chr(Char)
  160.                         Char = ReadByte(file)
  161.                 Wend
  162.         Else
  163.                 For i = 1 To count
  164.                         Ret = Ret + Chr(ReadByte(file))
  165.                 Next
  166.         EndIf
  167.        
  168.         Return Ret
  169. End Function


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal