Mirage Source
PNG headers - Printable Version

+- Mirage Source (https://mirage-engine.uk/forums)
+-- Forum: Mirage Source (Nostalgia) (https://mirage-engine.uk/forums/forumdisplay.php?fid=61)
+--- Forum: Archive (2006-2011) (https://mirage-engine.uk/forums/forumdisplay.php?fid=18)
+---- Forum: Programming (https://mirage-engine.uk/forums/forumdisplay.php?fid=24)
+----- Forum: Visual Basic 6 (https://mirage-engine.uk/forums/forumdisplay.php?fid=32)
+----- Thread: PNG headers (/showthread.php?tid=3125)



PNG headers - Robin - 07-09-2009

PNG's header is confusing. I want to grab the image's width + height for loading it in dx8 without having to know the size beforehand.

Help?


Re: PNG headers - Robin - 07-09-2009

Darryl hooked me up with a sexy header reader for jpg + png.

Disregard this.


Re: PNG headers - Robin - 07-09-2009

Here's the code if anyone wants it.

Code:
' PNG Header data
Private Type PNGHeader
    Width As Integer
    Height As Integer
End Type

Code:
Private Function GetPNGSize(ByVal filename As String) As PNGHeader
Dim Buffer() As Byte
Dim ChunkSize As Long
Dim ChunkType As String
Dim f As Long

    f = FreeFile()
    Open filename For Binary As #f
        If Err  0 Then Exit Function
        If LOF(f) = 0 Then Exit Function
    
        ' Read the first 2 bytes to identifier
        ReDim Buffer(0 To 1)
        Get #f, , Buffer
    
        ' Get the next 6 bytes to confirms that a PNG
        ReDim Buffer(0 To 5)
        Get #f, , Buffer
        If Buffer(0)  &H4E Or Buffer(1)  &H47 Or Buffer(2)  &HD Or _
           Buffer(3)  &HA Or Buffer(4)  &H1A Or Buffer(5)  &HA Then
            Exit Function
        End If
        
        ' Dim the array. Both the chunk size and chunk type have 4 bytes
        ReDim Buffer(0 To 3)
        
        Do While True
            ' Get the chunk size
            Get #f, , Buffer
            ChunkSize = (Buffer(0) * (2 ^ 24)) + (Buffer(1) * (2 ^ 16)) + (Buffer(2) * (2 ^ 8)) + Buffer(3)
            
            ' Get the chunk type
            Get #f, , Buffer
            ChunkType = Chr(Buffer(0)) & Chr(Buffer(1)) & Chr(Buffer(2)) & Chr(Buffer(3))
            
            ' Set the array to chunk size all chunk
            ReDim Buffer(0 To ChunkSize - 1)
            Get #f, , Buffer
            
            Select Case ChunkType
                Case "IHDR"
                    ' Main Chunk with Height, Width
                    GetPNGSize.Width = (Buffer(0) * (2 ^ 24)) + (Buffer(1) * (2 ^ 16)) + (Buffer(2) * (2 ^ 8)) + Buffer(3)
                    GetPNGSize.Height = (Buffer(4) * (2 ^ 24)) + (Buffer(5) * (2 ^ 16)) + (Buffer(6) * (2 ^ 8)) + Buffer(7)
                    
                Case "IDAT", "IEND"
                    Exit Do
            End Select
        
            ReDim Buffer(0 To 3)
            
            ' Jump 4 bytes
            Get #f, , Buffer
        Loop
    Close #f
    
End Function



Re: PNG headers - GIAKEN - 07-09-2009

Wow very nice...


Re: PNG headers - xp79 - 09-09-2009

From what you said I imagened the code to be ALOT simpiler,
Wow thats quite something Confusedhock: