Ottenere alcune informazioni su file immagine JPEG con le funzioni del API di libjpeg

Da Gambas-it.org - Wikipedia.

Libjpeg è una libreria scritta in C utilizzata per la lettura e la scrittura di file immagine JPEG.

Utilizzando alcune risorse della libreria, attualmente alla versione "libjpeg.so.8.0.2" è possibile, fra l'altro, ottenere alcune informazioni relative al file immagine jpeg, come, ad esempio, la dimensione in pixel della larghezza e dell'altezza, nonché il numero di byte usato per definire un pixel.

Mostriamo un semplice esempio al riguardo:

Library "libjpeg:8.0.2"

' struct jpeg_error_mgr * jpeg_std_error(struct jpeg_error_mgr * err)
' Update error manager with error handling routines.
Private Extern jpeg_std_error(jpeg_error_mgr As Pointer) As Pointer

' void jpeg_CreateDecompress(j_decompress_ptr cinfo, int version, size_t structsize)
' Allocate and initialize a JPEG decompression object.
Private Extern jpeg_CreateDecompress(j_decompress_ptr As Pointer, version As Integer, structsize As Integer)

' void jpeg_stdio_src(j_decompress_ptr cinfo, FILE * infile)
' Initialize state for input from stdio stream.
Private Extern jpeg_stdio_src(j_decompress_ptr As Pointer, infile As Pointer)

' int jpeg_read_header(j_decompress_ptr cinfo, boolean require_image)
' Read start of JPEG datastream.
Private Extern jpeg_read_header(j_decompress_ptr As Pointer, require_image As Integer) As Integer

' boolean jpeg_start_decompress(j_decompress_ptr cinfo)
' Initialize a decompression cycle.
Private Extern jpeg_start_decompress(j_decompress_ptr As Pointer) As Integer

' void jpeg_destroy_decompress(j_decompress_ptr cinfo)
' Deallocate a JPEG decompression object
Private Extern jpeg_destroy_decompress(j_decompress_ptr As Pointer)


Library "libc:6"

' FILE *fopen(const char *path, const char *mode)
Private Extern fopen(path As String, mode As String) As Pointer

' int fclose(FILE *stream)
Private Extern fclose(fileStream As Pointer) As Integer


Public Sub Main()

 Dim fl, err_mgr, cinfo As Pointer
 Dim width, height, bytePerPixel As Integer
 Dim st As Stream

  fl = fopen("/percorso/del/file.jpg", "rb")

  err_mgr = Alloc(168)
  cinfo = Alloc(656)

  st = Memory cinfo For Read Write
   
  Write #st, jpeg_std_error(err_mgr) As Pointer
   
  jpeg_CreateDecompress(cinfo, 80, 656)
   
  jpeg_stdio_src(cinfo, fl)
   
  jpeg_read_header(cinfo, 1)
   
  jpeg_start_decompress(cinfo)
   
  Seek #st, 48
  Read #st, width
  Print "Numero pixel il larghezza: ", width

  Read #st, height
  Print "Numero pixel il altezza: ", height
  Seek #st, 60
 
  Read #st, bytePerPixel
  Print "Numero byte per pixel: ", Null, bytePerPixel


' Va a terminare:
  jpeg_destroy_decompress(cinfo)
  st.Close
  Free(cinfo)
  Free(err_mgr)
  fclose(fl)
 
End



Riferimenti