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.2.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.2.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(SizeOf(gb.Byte), 168)
 cinfo = Alloc(SizeOf(gb.Byte), 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 in larghezza: "; width

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

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


Riferimenti