Mirage Source
http://web.miragesource.net/forums/

PNG headers
http://web.miragesource.net/forums/viewtopic.php?f=143&t=6212
Page 1 of 1

Author:  Robin [ Mon Sep 07, 2009 1:08 pm ]
Post subject:  PNG headers

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?

Author:  Robin [ Mon Sep 07, 2009 2:41 pm ]
Post subject:  Re: PNG headers

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

Disregard this.

Author:  Robin [ Mon Sep 07, 2009 3:02 pm ]
Post subject:  Re: PNG headers

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

Author:  GIAKEN [ Mon Sep 07, 2009 5:59 pm ]
Post subject:  Re: PNG headers

Wow very nice...

Author:  xp79 [ Wed Sep 09, 2009 1:09 pm ]
Post subject:  Re: PNG headers

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

Page 1 of 1 All times are UTC
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/