Differenze tra le versioni di "Ottenere dati grezzi di un file immagine mediante le funzioni del API di GDK-PixBuf"

Da Gambas-it.org - Wikipedia.
Riga 158: Riga 158:
 
   dati = gdk_pixbuf_get_pixels(pixbuf)
 
   dati = gdk_pixbuf_get_pixels(pixbuf)
 
   If dati == 0 Then Error.Raise("Impossibile ottenere un 'Puntatore' ai dati dei pixel dell'immagine !")
 
   If dati == 0 Then Error.Raise("Impossibile ottenere un 'Puntatore' ai dati dei pixel dell'immagine !")
 
  g_object_unref(pixbuf)
 
 
    
 
    
 
  <FONT Color=gray>' ''Carichiamo i dati nel vettore "bb[]" per gestire successivamente i dati grezzi dei pixel:''</font>
 
  <FONT Color=gray>' ''Carichiamo i dati nel vettore "bb[]" per gestire successivamente i dati grezzi dei pixel:''</font>
Riga 179: Riga 177:
 
    
 
    
 
   st.Close
 
   st.Close
 
+
  g_object_unref(pixbuf)
 +
 
 
   PictureBox1.Picture = imago.Picture
 
   PictureBox1.Picture = imago.Picture
 
+
 
 
   imago.Save("/tmp/imago.png", 100)
 
   imago.Save("/tmp/imago.png", 100)
 
      
 
      

Versione delle 20:28, 19 nov 2021

GDK-PixBuf è una libreria grafica per il caricamento e la manipolazione delle immagini.

Alcune sue funzioni ci consentono di ottenere un Puntatore ai dati grezzi dei file immagine, e così di poterli estrarre.

Sarà necessario avere installata nel sistema la libreria: "libgdk_pixbuf-2.0.so.0.4000.0 "

Mostriamo un semplice esempio pratico:

Library "libgdk_pixbuf-2.0:0.4000.0"

' GdkPixbuf * gdk_pixbuf_new_from_file (const char *filename, GError **error)
' Creates a new pixbuf by loading an image from a file.
Private Extern gdk_pixbuf_new_from_file(filename As String, GError As Pointer) As Pointer

' guchar * gdk_pixbuf_get_pixels (const GdkPixbuf *pixbuf)
' Queries a pointer to the pixel data of a pixbuf.
Private Extern gdk_pixbuf_get_pixels(GdkPixbuf As Pointer) As Pointer

' int gdk_pixbuf_get_width (const GdkPixbuf *pixbuf)
' Queries the width of a pixbuf.
Private Extern gdk_pixbuf_get_width(GdkPixbuf As Pointer) As Integer

' int gdk_pixbuf_get_height (const GdkPixbuf *pixbuf)
' Queries the height of a pixbuf.
Private Extern gdk_pixbuf_get_height(GdkPixbuf As Pointer) As Integer

' int gdk_pixbuf_get_n_channels (const GdkPixbuf *pixbuf)
' Queries the number of channels of a pixbuf.
Private Extern gdk_pixbuf_get_n_channels(GdkPixbuf As Pointer) As Integer

' gboolean gdk_pixbuf_get_has_alpha (const GdkPixbuf *pixbuf)
' Queries whether a pixbuf has an alpha channel (opacity information).
Private Extern gdk_pixbuf_get_has_alpha(GdkPixbuf As Pointer) As Boolean

' void g_object_unref (gpointer object)
' Decreases the reference count of object.
Private Extern g_object_unref(gobject As Pointer)


Public Sub Main()

 Dim nomefile As String
 Dim w, h, i, n As Integer
 Dim pixbuf, dati As Pointer
 Dim b As Byte
 Dim bo As Boolean
 Dim st As Stream
 
 nomeFile = "/percorso/del/file/immagine"

 pixbuf = gdk_pixbuf_new_from_file(nomefile, 0)
 If pixbuf == 0 Then Error.Raise("Errore !")
 
 Print "File immagine: "; nomeFile
 w = gdk_pixbuf_get_width(pixbuf)
 Print "Larghezza:     "; w; " pixel"
 h = gdk_pixbuf_get_height(pixbuf)
 Print "Altezza:       "; h; " pixel"
 i = gdk_pixbuf_get_n_channels(pixbuf)
 Print "Canali:        "; i
 bo = gdk_pixbuf_get_has_alpha(pixbuf)
 Print "Canale Alfa:   "; bo

 dati = gdk_pixbuf_get_pixels(pixbuf)
 If dati == 0 Then Error.Raise("Errore !")
 
' Dereferenziamo il Puntatore con i "Memory Stream", e ne leggiamo i valori contenuti (i dati/byte grezzi dei pixel) dell'immagine:
 st = Memory dati For Read
 For n = 0 To (w * h * i) - 1
   Read #st, b
   Print n, Hex(b)
 Next

 st.Close
 g_object_unref(pixbuf)

End


In quest'altro esempio caricata un'immagine, utilizzando le risorse di Gambas, ed infine i dati ottenuti dei pixel saranno riutilizzati ricreando una nuova immagine identica all'immagine originaria:

Library "libgdk_pixbuf-2.0:0.4000.0"

' GdkPixbufLoader * gdk_pixbuf_loader_new(void)
' Creates a new pixbuf loader object.
Private Extern gdk_pixbuf_loader_new() As Pointer

' gboolean gdk_pixbuf_loader_write (GdkPixbufLoader *loader, const guchar *buf, gsize count, GError **error)
' Cause a pixbuf loader to parse the next count bytes of an image.
Private Extern gdk_pixbuf_loader_write(lo As Pointer, buf As Pointer, i As Integer, po As Pointer)

' gboolean gdk_pixbuf_loader_close (GdkPixbufLoader *loader, GError **error)
' Informs a pixbuf loader that no further writes.
Private Extern gdk_pixbuf_loader_close(lo As Pointer, po As Pointer)

' GdkPixbuf * gdk_pixbuf_loader_get_pixbuf (GdkPixbufLoader *loader)
' Queries the GdkPixbuf that a pixbuf loader is currently creating.
Private Extern gdk_pixbuf_loader_get_pixbuf(lo As Pointer) As Pointer
 
' guchar * gdk_pixbuf_get_pixels (const GdkPixbuf *pixbuf)
' Queries a pointer to the pixel data of a pixbuf.
Private Extern gdk_pixbuf_get_pixels(GdkPixbuf As Pointer) As Pointer

' int gdk_pixbuf_get_width (const GdkPixbuf *pixbuf)
' Queries the width of a pixbuf.
Private Extern gdk_pixbuf_get_width(GdkPixbuf As Pointer) As Integer

' int gdk_pixbuf_get_height (const GdkPixbuf *pixbuf)
' Queries the height of a pixbuf.
Private Extern gdk_pixbuf_get_height(GdkPixbuf As Pointer) As Integer

' int gdk_pixbuf_get_n_channels (const GdkPixbuf *pixbuf)
' Queries the number of channels of a pixbuf.
Private Extern gdk_pixbuf_get_n_channels(GdkPixbuf As Pointer) As Integer

' gboolean gdk_pixbuf_get_has_alpha (const GdkPixbuf *pixbuf)
' Queries whether a pixbuf has an alpha channel (opacity information).
Private Extern gdk_pixbuf_get_has_alpha(GdkPixbuf As Pointer) As Boolean

' void g_object_unref (gpointer object)
' Decreases the reference count of object.
Private Extern g_object_unref(gobject As Pointer)


Public Sub Form_Open()
 
 Dim fl As File
 Dim bb As Byte[]
 Dim w, h, i As Integer
 Dim loader, pixbuf, dati As Pointer
 Dim bo As Boolean
 Dim st As Stream
 Dim imago As Image
   
 fl = Open "/percorso/del/file/immagine" For Read
  
 With bb = New Byte[Lof(fl)]
   .Read(fl, 0, bb.Count)
 End With
  
 fl.Close
  
 loader = gdk_pixbuf_loader_new()
 If loader == 0 Then Error.Raise("Errore !")
  
 gdk_pixbuf_loader_write(loader, bb.data, bb.count, 0)
 gdk_pixbuf_loader_close(loader, 0)
 pixbuf = gdk_pixbuf_loader_get_pixbuf(loader)
 If pixbuf == 0 Then Error.Raise("Errore !")
  
 w = gdk_pixbuf_get_width(pixbuf)
 Print "Larghezza:   "; w; " pixel"
 h = gdk_pixbuf_get_height(pixbuf)
 Print "Altezza:     "; h; " pixel"
 i = gdk_pixbuf_get_n_channels(pixbuf)
 Print "Canali:      "; i
 bo = gdk_pixbuf_get_has_alpha(pixbuf)
 Print "Canale Alfa: "; bo

 dati = gdk_pixbuf_get_pixels(pixbuf)
 If dati == 0 Then Error.Raise("Impossibile ottenere un 'Puntatore' ai dati dei pixel dell'immagine !")
 
' Carichiamo i dati nel vettore "bb[]" per gestire successivamente i dati grezzi dei pixel:
 st = Memory dati For Read
  
 With bb = New Byte[w * h * i]
   .Read(st, 0, .count)
 End With
   
 st.Close
  
' Viene preparata la variabile di tipo immagine per la gestione dei dati del futuro nuovo file immagine:
 With imago = New Image(w, h, 0, Image.Standard)
   st = Memory .Data For Write
 End With
  
' Scrive i dati presenti nel vettore "bb[]" nella varibile di tipo "Image":
 bb.Write(st, 0, bb.Count)
  
 st.Close
 g_object_unref(pixbuf)
 
 PictureBox1.Picture = imago.Picture
 
 imago.Save("/tmp/imago.png", 100)
   
End


Riferimenti