Ruotare e ribaltare sul proprio asse una immagine con le funzioni del API di FreeImage

Da Gambas-it.org - Wikipedia.

FreeImage è una libreria open source per gli sviluppatori che desiderano gestire immagini grafiche di formato PNG, BMP, JPEG, TIFF e altri come richiesti dalle odierne applicazioni multimediali.

Per poter fruire in Gambas delle risorse di FreeImage, è necessario avere installata nel sistema e richiamare la libreria dinamica condivisa: "libfreeimage-3.15.4.so"

Questa libreria consente, fra l'altro, di ruotare e di ribaltare un'immagine sui propri assi orizzontale e verticale.

Mostriamo un esempio pratico:

Library "libfreeimage-3.15.4"

Private Enum FIF_UNKNOWN = -1, FIF_BMP, FIF_ICO, FIF_JPEG, FIF_JNG, FIF_KOALA, FIF_LBM, FIF_IFF = 5, FIF_MNG = 6,
             FIF_PBM, FIF_PBMRAW, FIF_PCD, FIF_PCX, FIF_PGM, FIF_PGMRAW, FIF_PNG, FIF_PPM, FIF_PPMRAW, FIF_RAS,
             FIF_TARGA, FIF_TIFF, FIF_WBMP, FIF_PSD, FIF_CUT, FIF_XBM, FIF_XPM, FIF_DDS, FIF_GIF, FIF_HDR, FIF_FAXG3,
             FIF_SGI, FIF_EXR, FIF_J2K, FIF_JP2, FIF_PFM, FIF_PICT, FIF_RAW

Private Const PNG_DEFAULT As Integer = 0

' void FreeImage_Initialise(BOOL FI_DEFAULT(FALSE))
' Initialises the library.
Private Extern FreeImage_Initialise(fi_default As Boolean)

' const char * FreeImage_GetCopyrightMessage(void)
' Returns a string containing a standard copyright message.
Private Extern FreeImage_GetCopyrightMessage() As String

' FIBITMAP * FreeImage_Load(FREE_IMAGE_FORMAT fif, const char *filename, int flags FI_DEFAULT(0))
' Load routines. Decodes a bitmap, allocates memory for it and then returns it as a FIBITMAP.
Private Extern FreeImage_Load(fif As Integer, filename As String, flags As Integer) As Pointer

' unsigned FreeImage_GetWidth(FIBITMAP *dib)
' Returns the width of the bitmap in pixel units.
Private Extern FreeImage_GetWidth(dib As Pointer) As Integer

' unsigned FreeImage_GetHeight(FIBITMAP *dib)
' Returns the height of the bitmap in pixel units.
Private Extern FreeImage_GetHeight(dib As Pointer) As Integer

' FIBITMAP * FreeImage_RotateClassic(FIBITMAP *dib, double angle)
' Rotates a 1-, 8-bit greyscale or a 24-, 32-bit color image by means of 3 shears.
Private Extern FreeImage_RotateClassic(dib As Pointer, angle As Float) As Pointer

' BOOL FreeImage_FlipHorizontal(FIBITMAP *dib)
' Flip the input dib horizontally along the vertical axis.
Private Extern FreeImage_FlipHorizontal(dib As Pointer) As Boolean

' BOOL FreeImage_FlipVertical(FIBITMAP *dib)
' Flip the input dib vertically along the horizontal axis.
Private Extern FreeImage_FlipVertical(dib As Pointer) As Boolean

' BOOL FreeImage_Save(FREE_IMAGE_FORMAT fif, FIBITMAP *dib, const char *filename, int flags FI_DEFAULT(0))
' Saves a previously loaded FIBITMAP to a file.
Private Extern FreeImage_Save(fif As Integer, dib As Pointer, filename As String, flags As Integer) As Boolean

' void FreeImage_Unload(FIBITMAP *dib)
' Unload routines.
Private Extern FreeImage_Unload(dib As Pointer)

' void FreeImage_DeInitialise(void)
' Deinitialises the library.
Private Extern FreeImage_DeInitialise()


Public Sub Main()
 
 Dim cp, im As String
 Dim fbm As Pointer
 Dim bo As Boolean
 
' Inizializza la libreria "FreeImage":
  FreeImage_Initialise(False)
  
  cp = FreeImage_GetCopyrightMessage()
  Print cp
  
  im = "/percorso/del/file/immagine.png"
  If Exist(im) = False Then Error.Raise("File immagine '" & im & "' inesistente !")
  
  fbm = FreeImage_Load(FIF_PNG, im, PNG_DEFAULT)
  If fbm = 0 Then Error.Raise("Impossibile caricare l'immagine " & im)
  
' Mostra alcune informazioni sul file immagine caricato:
  Print "\nFile immagine: "; im
  Print "Dimensione:    "; FreeImage_GetWidth(fbm); "x"; FreeImage_GetHeight(fbm)
  
' Ruota l'immagine di 45°:
  fbm = FreeImage_RotateClassic(fbm, 45)
  
' Ribalta l'immagine sul proprio asse orizzontale:
  FreeImage_FlipHorizontal(fbm)
  
' Ribalta l'immagine sul proprio asse verticale:
  FreeImage_FlipVertical(fbm)
  
  bo = FreeImage_Save(FIF_PNG, fbm, "/percorso/del/nuovo/file/immagine.png", PNG_DEFAULT)
  If bo = False Then Error.Raise("Impossibile salvare l'immagine !")
  
' Libera la memoria precedentemente allocata e deinizializza la libreria "FreeImage":
  FreeImage_Unload(fbm)
  FreeImage_DeInitialise()
  
End



Riferimenti