Help Center
Help CenterFreeBASICTutorials

FreeImage

Documentation

FreeImage is an Open Source library project for developers who would like to support popular graphics image formats like PNG, BMP, JPEG, TIFF and others as needed by today's multimedia applications. FreeImage is easy to use, fast, multithreading safe, compatible with all 32-bit versions of Windows, and cross-platform (works both with Linux and Mac OS X).

Website: http://freeimage.sourceforge.net/
Platforms supported: Win32, Linux
Headers to include: FreeImage.bi
Header version: 3.15.1
Example included: yes, in examples/files/FreeImage

Example

Here follows an example of using FreeImage in FreeBASIC. If using Windows you will require freeimage.dll which is available from the FreeImage site.
'' Code example for loading all common image types using FreeImage.

'' The example loads an image passed as a command line argument.



'' The function FI_Load returns a null pointer (0) if there was an error during

'' loading.  Otherwise it returns a 32-bit PUT compatible buffer.



#include "FreeImage.bi"

#include "crt.bi"

#include "fbgfx.bi"



Function FI_Load(filename As String) As Any Ptr

    If Len(filename) = 0 Then

        Return NULL

    End If



    '' Find out the image format

    Dim As FREE_IMAGE_FORMAT form = FreeImage_GetFileType(StrPtr(filename), 0)

    If form = FIF_UNKNOWN Then

        form = FreeImage_GetFIFFromFilename(StrPtr(filename))

    End If



    '' Exit if unknown

    If form = FIF_UNKNOWN Then

        Return NULL

    End If



    '' Always load jpegs accurately

    Dim As UInteger flags = 0

    If form = FIF_JPEG Then

        flags = JPEG_ACCURATE

    End If



    '' Load the image into memory

    Dim As FIBITMAP Ptr image = FreeImage_Load(form, StrPtr(filename), flags)

    If image = NULL Then

        '' FreeImage failed to read in the image

        Return NULL

    End If



    '' Flip the image so it matches FB's coordinate system

    FreeImage_FlipVertical(image)



    '' Convert to 32 bits per pixel

    Dim As FIBITMAP Ptr image32 = FreeImage_ConvertTo32Bits(image)



    '' Get the image's size

    Dim As UInteger w = FreeImage_GetWidth(image)

    Dim As UInteger h = FreeImage_GetHeight(image)



    '' Create an FB image of the same size

    Dim As fb.Image Ptr sprite = ImageCreate(w, h)



    Dim As Byte Ptr target = CPtr(Byte Ptr, sprite + 1)

    Dim As Integer target_pitch = sprite->pitch



    Dim As Any Ptr source = FreeImage_GetBits(image32)

    Dim As Integer source_pitch = FreeImage_GetPitch(image32)



    '' And copy over the pixels, row by row

    For y As Integer = 0 To (h - 1)

        memcpy(target + (y * target_pitch), _

               source + (y * source_pitch), _

               w * 4)

    Next



    FreeImage_Unload(image32)

    FreeImage_Unload(image)



    Return sprite

End Function



ScreenRes 640, 480, 32



Dim As String filename = Command(1)



Dim As Any Ptr image = FI_Load(filename)

If image <> 0 Then

    Put (0, 0), image

    ImageDestroy(image)

Else

    Print "Problem while loading file : " & filename

End If



Sleep