JanetTerra JanetTerra Apr 16, 2006 - "Edited to restore Block Indentation"

[[user:JanetTerra|1145245208]]

It is possible to load and display graphics in formats other than bitmap in Liberty BASIC programs. This does require the use of the atl DLL or a third party DLL such as [[http://alycesrestaurant.com/lbbrowse.htm|lbbrowse3.dll]]. Finding the dimensions of a [[http://en.wikipedia.org/wiki/PNG|Portable Network Graphics]] (PNG) file is very similar to that of getting the dimensions of a [[http://basic.wikispaces.com/BitMap+Dimensions+2/|bitmap file]]. The file must be opened and the first three Lines Inputted. The 7th, 8th, 11th and 12th Bytes of the third Line Input are then parsed for the pertinent information.

[[code]]

' Choose a PNG File
    Filedialog "Finding the PNG Dimensions", "*.*", pngFile$
    If pngFile$ = "" Then End

' Obtain pngInfo in 3 Line Inputs
    Dim pngInfo$(3)
    Open pngFile$ for Input as #png
        For i = 1 to 3
            Line Input #png, pngInfo$
            pngInfo$(i) = pngInfo$
        Next i
    Close #png
    Print

' 1st Byte is a High Bit to reduce possibility text file is mistaken for png file
    hiBitDec = Asc(Mid$(pngInfo$(1), 1, 1))
    hiBitHex$ = DecHex$(hiBitDec)
    Print hiBitHex$ 'hiBitHex$ = "89"

' Next 3 Bytes are the ASCII values of P N G for easy identification of format
    For i = 2 to 4
        Print Mid$(pngInfo$(1), i, 1);" "; ' Prints P N G
    Next i
    Print: Print

' Next are Bytes coded to detect the line ending conversion
'    OA = Line Feed
'    OD OA = Carriage Return plus Line Feed
'    1A = Stop Display of File
    Print pngInfo$(2)
    Print

' The rest of the information follows in the third Line Input
' Each block of information is referred to as a chunk
' The first chunk in this block is always the header identified by IHDR
' Only a few of the Bytes need to be parsed to find the width and height
    For i = 1 to 4
        Print Mid$(pngInfo$(3), i, 1);" "; ' Prints I D H R
    Next i
    Print: Print
' The PNG Width is stored in the 7th and 8th Bytes of this third Line Input
    pngWidth = Asc(Mid$(pngInfo$(3), 8, 1)) + Asc(Mid$(pngInfo$(3), 7, 1)) * 256
    Print "pngWidth = ";pngWidth
    Print
' The PNG Height is stored in the 11th and 12th Bytes of this third Line Input
    pngHeight = Asc(Mid$(pngInfo$(3), 12, 1)) + Asc(Mid$(pngInfo$(3), 11, 1)) * 256
    Print "pngHeight = ";pngHeight
    Print

    End

[[code]]
To use this within your Liberty BASIC program, you only need the these lines
[[code]]
Open pngFile$ for Input as #png
    Line Input pngSignature$
    Line Input pngLineEnd$
    Line Input pngInfo$
Close #png
pngWidth = Asc(Mid$(pngInfo$, 8, 1)) + Asc(Mid$(pngInfo$, 7, 1)) * 256
pngHeight = Asc(Mid$(pngInfo$, 12, 1)) + Asc(Mid$(pngInfo$, 11, 1)) * 256
[[code]]