Differenze tra le versioni di "Convertire un'immagine a colori in un'immagine a scala di grigi mediante le funzioni esterne del API di Libgdk pixbuf"

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
 
La libreria '''GDK-PixBuf''' consente il caricamento delle immagini e la manipolazione del buffer dei pixel.
 
La libreria '''GDK-PixBuf''' consente il caricamento delle immagini e la manipolazione del buffer dei pixel.
  
Per poter fruire in Gambas delle risorse di questa libreria è necessario installare e richiamare la libreria condivisa e dinamica: "''libgdk_pixbuf-2.0.so.0.3000.7''"
+
Per poter fruire in Gambas delle risorse di questa libreria è necessario installare e richiamare la libreria condivisa e dinamica: "''libgdk_pixbuf-2.0.so.0.4000.0'' "
 
 
  
 
Con le risorse della libreria ''GDK-PixBuf'' è possibile anche convertire un'immagine a colori in un'immagine a scala di grigi.
 
Con le risorse della libreria ''GDK-PixBuf'' è possibile anche convertire un'immagine a colori in un'immagine a scala di grigi.
 
<BR>Mostriamo un semplice esempio, nel quale un'immagine a colori di formato .jpg viene convertita in immagine .png a scala di grigi:
 
<BR>Mostriamo un semplice esempio, nel quale un'immagine a colori di formato .jpg viene convertita in immagine .png a scala di grigi:
  Library "libgdk_pixbuf-2.0:0.3000.7"
+
  Library "libgdk_pixbuf-2.0:0.4000.0"
 
   
 
   
 
  <FONT Color=gray>' ''GdkPixbuf * gdk_pixbuf_new_from_file (const char *filename, GError **error)''
 
  <FONT Color=gray>' ''GdkPixbuf * gdk_pixbuf_new_from_file (const char *filename, GError **error)''
Riga 46: Riga 45:
 
   Dim imm As String = "''/percorso/della/immagine/da/convertire''"
 
   Dim imm As String = "''/percorso/della/immagine/da/convertire''"
 
   
 
   
  Print "File immagine: ";; imm
+
  Print "File immagine: ";; imm
 
   
 
   
  pixbuf = gdk_pixbuf_new_from_file(imm, VarPtr(err))
+
  pixbuf = gdk_pixbuf_new_from_file(imm, VarPtr(err))
  If err <> 0 Then Error.Raise("Impossibile caricare l'immagine !")
+
  If err <> 0 Then Error.Raise("Impossibile caricare l'immagine !")
 
   
 
   
  gray = grayscale_pixbuf(pixbuf)
+
  gray = grayscale_pixbuf(pixbuf)
 
   
 
   
  gdk_pixbuf_save(gray, "/tmp/icona.png", "png", VarPtr(err), Null)
+
  gdk_pixbuf_save(gray, "/tmp/icona.png", "png", VarPtr(err), Null)
  If err <> 0 Then Error.Raise("Impossibile salvare l'immagine in scala di grigi!")
+
  If err <> 0 Then Error.Raise("Impossibile salvare l'immagine in scala di grigi!")
 
      
 
      
 
  '''End'''
 
  '''End'''
 
 
   
 
   
 
  '''Private''' Function grayscale_pixbuf(pixbuf As Pointer) As Pointer
 
  '''Private''' Function grayscale_pixbuf(pixbuf As Pointer) As Pointer
Riga 68: Riga 66:
 
   Dim st As Stream
 
   Dim st As Stream
 
    
 
    
  gray = gdk_pixbuf_copy(pixbuf)
+
  gray = gdk_pixbuf_copy(pixbuf)
 
    
 
    
  rowstride = gdk_pixbuf_get_rowstride(gray)
+
  rowstride = gdk_pixbuf_get_rowstride(gray)
  If gdk_pixbuf_get_has_alpha(gray) Then
+
  If gdk_pixbuf_get_has_alpha(gray) Then
    pixstride = 4
+
    pixstride = 4
  Else  
+
  Else  
    pixstride = 3
+
    pixstride = 3
  Endif
+
  Endif
  pixels = gdk_pixbuf_get_pixels(gray)
+
  pixels = gdk_pixbuf_get_pixels(gray)
  n_rows = gdk_pixbuf_get_height(gray)
+
  n_rows = gdk_pixbuf_get_height(gray)
  width = gdk_pixbuf_get_width(gray)
+
  width = gdk_pixbuf_get_width(gray)
 
    
 
    
  Print "Larghezza: "; Null, width; " pixel"
+
  Print "Larghezza: "; Null, width; " pixel"
  Print "Altezza: "; Null, n_rows; " pixel"
+
  Print "Altezza: "; Null, n_rows; " pixel"
 
   
 
   
  While (row < n_rows)
+
  While (row < n_rows)
    p = pixels + (row * rowstride)
+
    p = pixels + (row * rowstride)
    endp = p + (pixstride * width)
+
    endp = p + (pixstride * width)
    st = Memory p For Write
+
    st = Memory p For Write
      While p <> endp
+
      While p <> endp
        p1 = p
+
        p1 = p
        p2 = p + 1
+
        p2 = p + 1
        p3 = p + 2
+
        p3 = p + 2
        v = CFloat(Byte@(p1) * 0.30) + (Byte@(p2) * 0.59) + (Byte@(p3) * 0.11)
+
        v = CFloat(Byte@(p1) * 0.30) + (Byte@(p2) * 0.59) + (Byte@(p3) * 0.11)
        Write #st, CByte(v) As Byte
+
        Write #st, CByte(v) As Byte
        Write #st, CByte(v) As Byte
+
        Write #st, CByte(v) As Byte
        Write #st, CByte(v) As Byte
+
        Write #st, CByte(v) As Byte
        p += pixstride
+
        p += pixstride
      Wend
+
      Wend
    Inc row
+
    Inc row
  Wend
+
  Wend
 
    
 
    
  st.Close
+
  st.Close
 
    
 
    
  Return gray
+
  Return gray
 
   
 
   
 
  '''End'''
 
  '''End'''
 
 
  
  

Versione delle 19:43, 19 nov 2021

La libreria GDK-PixBuf consente il caricamento delle immagini e la manipolazione del buffer dei pixel.

Per poter fruire in Gambas delle risorse di questa libreria è necessario installare e richiamare la libreria condivisa e dinamica: "libgdk_pixbuf-2.0.so.0.4000.0 "

Con le risorse della libreria GDK-PixBuf è possibile anche convertire un'immagine a colori in un'immagine a scala di grigi.
Mostriamo un semplice esempio, nel quale un'immagine a colori di formato .jpg viene convertita in immagine .png a scala di grigi:

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

' GdkPixbuf * gdk_pixbuf_copy (const GdkPixbuf *pixbuf)
' Creates a new GdkPixbuf with a copy of the information in the specified pixbuf.
Private Extern gdk_pixbuf_copy(GdkPixbuf As Pointer) As Pointer

' gboolean gdk_pixbuf_save (GdkPixbuf *pixbuf, const char *filename, const char *type, GError **error, ...)
' Saves pixbuf to a file in format type. By default, "jpeg", "png", "ico" and "bmp" are possible file formats to save in.
Private Extern gdk_pixbuf_save(GdkPixbuf As Pointer, filename As String, type As String, GErr As Pointer, altro As String) As Boolean

' int gdk_pixbuf_get_rowstride (const GdkPixbuf *pixbuf)
' Queries the rowstride of a pixbuf, which is the number of bytes between the start of a row and the start of the next row.
Private Extern gdk_pixbuf_get_rowstride(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

' 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_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_width(GdkPixbuf As Pointer) As Integer
' Queries the width of a pixbuf.
Private Extern gdk_pixbuf_get_width(GdkPixbuf As Pointer) As Integer


Public Sub Main()

 Dim pixbuf, err As Pointer
 Dim imm As String = "/percorso/della/immagine/da/convertire"

 Print "File immagine: ";; imm

 pixbuf = gdk_pixbuf_new_from_file(imm, VarPtr(err))
 If err <> 0 Then Error.Raise("Impossibile caricare l'immagine !")

 gray = grayscale_pixbuf(pixbuf)

 gdk_pixbuf_save(gray, "/tmp/icona.png", "png", VarPtr(err), Null)
 If err <> 0 Then Error.Raise("Impossibile salvare l'immagine in scala di grigi!")
    
End

Private Function grayscale_pixbuf(pixbuf As Pointer) As Pointer
 
 Dim gray As Pointer
 Dim rowstride, pixstride, row, n_rows, width As Integer
 Dim pixels, endp, p As Pointer
 Dim v As Float
 Dim p1, p2, p3 As Pointer
 Dim st As Stream
  
 gray = gdk_pixbuf_copy(pixbuf)
 
 rowstride = gdk_pixbuf_get_rowstride(gray)
 If gdk_pixbuf_get_has_alpha(gray) Then
   pixstride = 4
 Else 
   pixstride = 3
 Endif
 pixels = gdk_pixbuf_get_pixels(gray)
 n_rows = gdk_pixbuf_get_height(gray)
 width = gdk_pixbuf_get_width(gray)
 
 Print "Larghezza: "; Null, width; " pixel"
 Print "Altezza: "; Null, n_rows; " pixel"

 While (row < n_rows)
   p = pixels + (row * rowstride)
   endp = p + (pixstride * width)
   st = Memory p For Write
     While p <> endp
       p1 = p
       p2 = p + 1
       p3 = p + 2
       v = CFloat(Byte@(p1) * 0.30) + (Byte@(p2) * 0.59) + (Byte@(p3) * 0.11)
       Write #st, CByte(v) As Byte
       Write #st, CByte(v) As Byte
       Write #st, CByte(v) As Byte
       p += pixstride
     Wend
   Inc row
 Wend
 
 st.Close
 
 Return gray

End


Riferimenti