Differenze tra le versioni di "Estrarre l'icona di un tipo di file"

Da Gambas-it.org - Wikipedia.
 
(4 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 
Quando un tipo di file è associato ad una determinata icona, tutti i file appartenenti a quel tipo saranno mostrati sul desktop con quell'icona.
 
Quando un tipo di file è associato ad una determinata icona, tutti i file appartenenti a quel tipo saranno mostrati sul desktop con quell'icona.
  
Per estrarre l'icona associata ad un tipo di file, si potranno utilizzare due modalità: una con le funzioni proprie di Gambas, l'altra con le funzioni esterne delle librerie di ''GTK-3'' e di ''GIO''.
+
Per estrarre l'icona associata ad un tipo di file, si potranno utilizzare due modalità: una con le funzioni proprie di Gambas, l'altra con le funzioni esterne delle librerie ''libgio-2.0'', ''libgtk-3'' e ''libgdk_pixbuf-2.0''.
 
 
  
  
Riga 9: Riga 8:
  
  
===Uso del metodo ''Desktop.GetFileIcon()''===
+
===Uso del Metodo "Desktop.GetFileIcon()"===
Il metodo ''Desktop.GetFileIcon()'' ritorna l'icona, come ''Picture'', associata ad un tipo di file.
+
Il Metodo "Desktop.GetFileIcon()" ritorna l'icona, come ''Picture'', associata ad un tipo di file.
  
 
Nel seguente semplice esempio poniamo sul ''Form'' dell'applicazione una ''PictureBox'', nella quale verrà mostrata liconda associata al tipo di file prescelto:
 
Nel seguente semplice esempio poniamo sul ''Form'' dell'applicazione una ''PictureBox'', nella quale verrà mostrata liconda associata al tipo di file prescelto:
Riga 22: Riga 21:
  
 
===Uso della Classe ''DesktopMime''===
 
===Uso della Classe ''DesktopMime''===
Della la Classe ''DesktopMime'' useremo i metodi ''.FromFile()'' e ''.GetIcon()''.
+
Della la Classe ''DesktopMime'' useremo i Metodi ".FromFile()" e ".GetIcon()".
  
 
Nel semplice esempio seguente attiviamo il componente ''gb.desktop'' e poniamo sul ''Form'' dell'applicazione un ''Button'' ed una ''PictureBox'', nella quale sarà mostrata l'icona del tipo di file individuato:
 
Nel semplice esempio seguente attiviamo il componente ''gb.desktop'' e poniamo sul ''Form'' dell'applicazione un ''Button'' ed una ''PictureBox'', nella quale sarà mostrata l'icona del tipo di file individuato:
Riga 28: Riga 27:
 
        
 
        
 
   Dim percorso As String
 
   Dim percorso As String
   Dim i as Image
+
   Dim im as Image
 
    
 
    
  percorso = "<FONT Color=gray>''/percorso/del/file''</font>"
+
  percorso = "<FONT Color=gray>''/percorso/del/file''</font>"
 
   
 
   
  i = DesktopMime.FromFile(percorso).GetIcon(48)
+
  im = DesktopMime.FromFile(percorso).GetIcon(48)
  PictureBox1.Picture = i.Picture
+
  PictureBox1.Image = im
 
    
 
    
 
  '''End'''
 
  '''End'''
Anche in quest'altro caso il valore richiesto dal metodo ''.GetIcon()'', che nell'esempio abbiamo posto con valore 48, rappresenta la dimensione espressa in pixel, con la quale sarà mostrata l'icona nella ''PictureBox''.
+
Anche in quest'altro caso il valore richiesto dal Metodo ".GetIcon()", che nell'esempio abbiamo posto con valore 48, rappresenta la dimensione espressa in pixel, con la quale sarà mostrata l'icona nella ''PictureBox''.
 
 
  
  
==Uso delle librerie esterne di GTK-3 e di GIO==
+
==Uso delle librerie esterne ''libgio-2.0'', ''libgtk-3'' e ''libgdk_pixbuf-2.0''==
Quest'altra soluzione presuppone l'esistenza nel sistema delle librerie esterne ''libgtk-3.so.0.1000.8'' e ''libgio-2.0.so.0.4002.0'' .
+
Quest'altra soluzione presuppone l'esistenza nel sistema delle librerie esterne ''libgio-2.0.so'', ''libgtk-3.so'' e ''libgdk_pixbuf-2.0.so''.
  
 
Di seguito mostriamo due modalità legate a detta soluzione, delle quali saranno mostrati due esempi che richiedono entrambi:
 
Di seguito mostriamo due modalità legate a detta soluzione, delle quali saranno mostrati due esempi che richiedono entrambi:
Riga 48: Riga 46:
  
 
Prima modalità:
 
Prima modalità:
  Library "libgtk-3:0.1000.8"
+
  Library "libgtk-3:0.2404.29"
 
   
 
   
 
  Private Enum GTK_ICON_LOOKUP_NO_SVG = 1,
 
  Private Enum GTK_ICON_LOOKUP_NO_SVG = 1,
Riga 73: Riga 71:
 
   
 
   
 
   
 
   
  Library "libgio-2.0:0.4002.0"
+
  Library "libgio-2.0:0.7200.4"
 
   
 
   
 
  <FONT Color=gray>' ''gchar * g_content_type_guess (const gchar *filename, const guchar *data, gsize data_size, gboolean *result_uncertain)''
 
  <FONT Color=gray>' ''gchar * g_content_type_guess (const gchar *filename, const guchar *data, gsize data_size, gboolean *result_uncertain)''
Riga 89: Riga 87:
 
   Dim nomefile As String
 
   Dim nomefile As String
 
   
 
   
  tipo = g_content_type_guess("<FONT Color=gray>''/percorso/del/file''</font>", 0, 0, bo)
+
  tipo = g_content_type_guess("<FONT Color=gray>''/percorso/del/file''</font>", 0, 0, bo)
  Print "Il mime-type del file è: "; String@(tipo)
+
  Print "Il mime-type del file è: "; String@(tipo)
    
+
  gtk_init(0, 0)
+
   gtk_init(0, 0)
  ico = g_content_type_get_icon(tipo)
+
  ico = g_content_type_get_icon(tipo)
  If IsNull(ico) Then Error.Raise("Impossibile ottenere l'icona del mime-type !")
+
  If ico == 0 Then Error.Raise("Impossibile ottenere l'icona del mime-type !")
    
+
  info = gtk_icon_theme_lookup_by_gicon(gtk_icon_theme_get_default(), ico, 48, GTK_ICON_LOOKUP_GENERIC_FALLBACK)
+
   info = gtk_icon_theme_lookup_by_gicon(gtk_icon_theme_get_default(), ico, 48, GTK_ICON_LOOKUP_GENERIC_FALLBACK)
    
+
  nomefile = gtk_icon_info_get_filename(info)
+
   nomefile = gtk_icon_info_get_filename(info)
  Print "Il file immagine dell'icona associata al tipo di file è: "; nomefile
+
  Print "Il file immagine dell'icona associata al tipo di file è: "; nomefile
    
+
  With PictureBox1
+
   With PictureBox1
    .W = ImageStat(nomefile).Width
+
    .W = ImageStat(nomefile).Width
    .H = ImageStat(nomefile).Height
+
    .H = ImageStat(nomefile).Height
    .Picture = Picture[nomefile]
+
    .Picture = Picture[nomefile]
  End With
+
  End With
 
   
 
   
 
  '''End'''
 
  '''End'''
 
  
 
Seconda modalità:
 
Seconda modalità:
  Library "libgio-2.0:0.4002.0"
+
  Library "libgio-2.0:0.7200.4"
 
   
 
   
 
  Private Enum G_FILE_QUERY_INFO_NONE = 0, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS
 
  Private Enum G_FILE_QUERY_INFO_NONE = 0, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS
Riga 132: Riga 129:
 
   
 
   
 
   
 
   
  Library "libgtk-3:0.1000.8"
+
  Library "libgtk-3:0.2404.29"
 
   
 
   
 
  Private Enum GTK_ICON_LOOKUP_NO_SVG = 1,
 
  Private Enum GTK_ICON_LOOKUP_NO_SVG = 1,
Riga 161: Riga 158:
 
   Dim percorso, ico, nomefile As String
 
   Dim percorso, ico, nomefile As String
 
   Dim gfl, gfi, gic, info As Pointer
 
   Dim gfl, gfi, gic, info As Pointer
 +
 +
  percorso = "<FONT Color=gray>''/percorso/del/file''</font>"
 
    
 
    
  percorso = "<FONT Color=gray>''/percorso/del/file''</font>"
+
  gfl = g_file_new_for_path(percorso)
 +
  If gfl == 0 Then Error.Raise("Impossibile caricare il file !")
 +
 +
  gfi = g_file_query_info(gfl, "standard::icon", G_FILE_QUERY_INFO_NONE, 0, 0)
 +
  If gfi == 0 Then Error.Raise("Impossibile richiedere informazioni sul file !")
 +
 +
  gic = g_file_info_get_icon(gfi)
 +
  If gic == 0 Then Error.Raise("Impossibile ottenere l'icona del file caricato !")
 +
 +
  ico = g_icon_to_string(gic)
 +
  Print "La rappresentazione testuale dell'icona del file è:", ico
 
    
 
    
  gfl = g_file_new_for_path(percorso)
+
  gtk_init(0, 0)
  If IsNull(gfl) Then Error.Raise("Impossibile caricare il file !")
 
   
 
  gfi = g_file_query_info(gfl, "standard::icon", G_FILE_QUERY_INFO_NONE, 0, 0)
 
  If IsNull(gfi) Then Error.Raise("Impossibile richiedere informazioni sul file !")
 
   
 
  gic = g_file_info_get_icon(gfi)
 
  If IsNull(gic) Then Error.Raise("Impossibile ottenere l'icona del file caricato !")
 
   
 
  ico = g_icon_to_string(gic)
 
  Print "La rappresentazione testuale dell'icona del file è:", ico
 
   
 
 
    
 
    
  gtk_init(0, 0)
+
  info = gtk_icon_theme_lookup_by_gicon(gtk_icon_theme_get_default(), gic, 48, GTK_ICON_LOOKUP_GENERIC_FALLBACK)
   
+
 
  info = gtk_icon_theme_lookup_by_gicon(gtk_icon_theme_get_default(), gic, 48, GTK_ICON_LOOKUP_GENERIC_FALLBACK)
+
  nomefile = gtk_icon_info_get_filename(info)
   
+
  Print "Il file immagine dell'icona associata al tipo di file è: "; nomefile
  nomefile = gtk_icon_info_get_filename(info)
+
 
  Print "Il file immagine dell'icona associata al tipo di file è: "; nomefile
+
  With PictureBox1
   
+
    .W = ImageStat(nomefile).Width
  With PictureBox1
+
    .H = ImageStat(nomefile).Height
    .W = ImageStat(nomefile).Width
+
    .Picture = Picture[nomefile]
    .H = ImageStat(nomefile).Height
+
  End With
    .Picture = Picture[nomefile]
+
    
   End With
+
'''End'''
   
+
 
 +
Terza modalità:
 +
Library "libgio-2.0:0.7200.4"
 +
 +
Private Enum G_FILE_QUERY_INFO_NONE = 0, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS
 +
Private Const G_FILE_ATTRIBUTE_STANDARD_ICON As String = "standard::icon"
 +
 +
<FONT Color=gray>' ''GFile * g_file_new_for_path (const char *path)''
 +
' ''Constructs a GFile for a given path.''</font>
 +
Private Extern g_file_new_for_path(path As String) As Pointer
 +
 +
<FONT Color=gray>' ''GFileInfo * g_file_query_info (GFile *file, const char *attributes, GFileQueryInfoFlags flags, GCancellable *cancellable, GError **error)''
 +
' ''Gets the requested information about specified file.''</font>
 +
Private Extern g_file_query_info(gfile As Pointer, attributes As String, flags As Integer, cancellable As Pointer, gerror As Pointer) As Pointer
 +
 +
<FONT Color=gray>' ''GIcon * g_file_info_get_icon (GFileInfo *info)''
 +
' ''Gets the icon for a file.''</font>
 +
Private Extern g_file_info_get_icon(info As Pointer) As Pointer
 +
 +
<FONT Color=gray>' ''void g_object_unref (gpointer object)''
 +
' ''Decreases the reference count of object.''</font>
 +
Private Extern g_object_unref(gobject As Pointer)
 +
 +
 +
Library "libgtk-3:0.2404.29"
 +
 +
Private Enum GTK_ICON_SIZE_INVALID = 0, GTK_ICON_SIZE_MENU, GTK_ICON_SIZE_SMALL_TOOLBAR, GTK_ICON_SIZE_LARGE_TOOLBAR,
 +
              GTK_ICON_SIZE_BUTTON, GTK_ICON_SIZE_DND, GTK_ICON_SIZE_DIALOG
 +
           
 +
Private Enum GTK_ICON_LOOKUP_NO_SVG = 0, GTK_ICON_LOOKUP_FORCE_SVG, GTK_ICON_LOOKUP_USE_BUILTIN, GTK_ICON_LOOKUP_GENERIC_FALLBACK, GTK_ICON_LOOKUP_FORCE_SIZE,
 +
              GTK_ICON_LOOKUP_FORCE_REGULAR, GTK_ICON_LOOKUP_FORCE_SYMBOLIC, GTK_ICON_LOOKUP_DIR_LTR, GTK_ICON_LOOKUP_DIR_RTL
 +
 +
<FONT Color=gray>' ''GtkIconTheme * gtk_icon_theme_get_default (void)''
 +
' ''Gets the icon theme for the default screen.''</font>
 +
Private Extern gtk_icon_theme_new() As Pointer
 +
 +
<FONT Color=gray>' ''gboolean gtk_icon_size_lookup (GtkIconSize size, gint *width, gint *height)''
 +
' ''Obtains the pixel size of a semantic icon size size.''</font>
 +
Private Extern gtk_icon_size_lookup(size As Integer, width As Pointer, height As Pointer) As Boolean
 +
 +
<FONT Color=gray>' ''GtkIconInfo * gtk_icon_theme_lookup_by_gicon (GtkIconTheme *icon_theme, GIcon *icon, gint size, GtkIconLookupFlags flags)''
 +
' ''Looks up an icon and returns a GtkIconInfo containing information such as the filename of the icon.''</font>
 +
Private Extern gtk_icon_theme_lookup_by_gicon(icon_theme As Pointer, icon As Pointer, size As Integer, flags As Integer) As Pointer
 +
 +
<FONT Color=gray>' ''GdkPixbuf * gtk_icon_info_load_icon (GtkIconInfo *icon_info, GError **error)''
 +
' ''Renders an icon previously looked up in an icon theme using gtk_icon_theme_lookup_icon().''</font>
 +
Private Extern gtk_icon_info_load_icon(icon_info As Pointer, gerror As Pointer) As Pointer
 +
 +
 +
Library "libgdk_pixbuf-2.0:0.4200.8"
 +
 +
<FONT Color=gray>' ''gboolean gdk_pixbuf_save (GdkPixbuf *pixbuf, const char *filename, const char *type, GError **error, ...)''
 +
' ''Saves pixbuf to a file in format type.''</font>
 +
Private Extern gdk_pixbuf_save(pixbuf As Pointer, filename As String, type As String, gerror As Pointer, ptr As Pointer) As Boolean
 +
 +
 +
'''Public''' Sub Main()
 +
 
 +
  Dim gf, gfi, ico As Pointer
 +
  Dim git, gii, pbuf As Pointer
 +
  Dim w As Integer
 +
 
 +
  gf = g_file_new_for_path("<FONT Color=gray>''/percorso/del/file''</font>")
 +
  If gf == 0 Then Error.Raise("ERRORE !")
 +
 
 +
  gfi = g_file_query_info(gf, G_FILE_ATTRIBUTE_STANDARD_ICON, G_FILE_QUERY_INFO_NONE, 0, 0)
 +
  If gfi == 0 Then Error.Raise("ERRORE !")
 +
 
 +
  ico = g_file_info_get_icon(gfi)
 +
  If ico == 0 Then Error.Raise("ERRORE !")
 +
 
 +
  git = gtk_icon_theme_new()
 +
  If git == 0 Then Error.Raise("ERRORE !")
 +
 +
  gtk_icon_size_lookup(GTK_ICON_SIZE_DIALOG, VarPtr(w), 0)
 +
 
 +
  gii = gtk_icon_theme_lookup_by_gicon(git, ico, w, GTK_ICON_LOOKUP_USE_BUILTIN)
 +
  If gii == 0 Then Error.Raise("ERRORE !")
 +
 +
  pbuf = gtk_icon_info_load_icon(gii, 0)
 +
  If pbuf == 0 Then Error.Raise("ERRORE !")
 +
 +
<FONT Color=gray>' ''Salva l'immagine dell'icona in un file immagine:''</font>
 +
  gdk_pixbuf_save(pbuf, "/tmp/test.png", "png", 0, 0)
 +
 
 +
<FONT Color=gray>' ''Libera la memoria utilizzata con la libreria Libgio-2.0:''</font>
 +
  g_object_unref(pbuf)
 +
  g_object_unref(gii)
 +
  g_object_unref(gfi)
 +
  g_object_unref(gf)
 +
 
 
  '''End'''
 
  '''End'''
  
Riga 195: Riga 283:
  
 
===Riferimenti===
 
===Riferimenti===
* [http://fossies.org/dox/gtk+-3.12.2/index.html l'API di GTK-3]
+
* https://fossies.org/dox/gtk+-3.24.32/index.html
* [https://developer.gnome.org/gio/stable/ l'API di GIO]
+
* https://docs.gtk.org/gio/

Versione attuale delle 08:03, 18 mag 2023

Quando un tipo di file è associato ad una determinata icona, tutti i file appartenenti a quel tipo saranno mostrati sul desktop con quell'icona.

Per estrarre l'icona associata ad un tipo di file, si potranno utilizzare due modalità: una con le funzioni proprie di Gambas, l'altra con le funzioni esterne delle librerie libgio-2.0, libgtk-3 e libgdk_pixbuf-2.0.


Uso delle funzioni di Gambas

L'uso delle funzioni di Gambas prevede l'attivazione dei componenti gb.desktop e gb.desktop.x11, con il quale si potranno utilizzare due suoi metodi.


Uso del Metodo "Desktop.GetFileIcon()"

Il Metodo "Desktop.GetFileIcon()" ritorna l'icona, come Picture, associata ad un tipo di file.

Nel seguente semplice esempio poniamo sul Form dell'applicazione una PictureBox, nella quale verrà mostrata liconda associata al tipo di file prescelto:

Public Sub Form_Open()

  PictureBox1.Picture = Desktop.GetFileIcon("/percorso/del/file", 48)

End

Il secondo parametro, che nell'esempio abbiamo posto con valore 48, rappresenta la dimensione espressa in pixel, con la quale sarà mostrata l'icona nella PictureBox.


Uso della Classe DesktopMime

Della la Classe DesktopMime useremo i Metodi ".FromFile()" e ".GetIcon()".

Nel semplice esempio seguente attiviamo il componente gb.desktop e poniamo sul Form dell'applicazione un Button ed una PictureBox, nella quale sarà mostrata l'icona del tipo di file individuato:

Public Sub Button1_Click()
     
 Dim percorso As String
 Dim im as Image
 
 percorso = "/percorso/del/file"

 im = DesktopMime.FromFile(percorso).GetIcon(48)
 PictureBox1.Image = im
 
End

Anche in quest'altro caso il valore richiesto dal Metodo ".GetIcon()", che nell'esempio abbiamo posto con valore 48, rappresenta la dimensione espressa in pixel, con la quale sarà mostrata l'icona nella PictureBox.


Uso delle librerie esterne libgio-2.0, libgtk-3 e libgdk_pixbuf-2.0

Quest'altra soluzione presuppone l'esistenza nel sistema delle librerie esterne libgio-2.0.so, libgtk-3.so e libgdk_pixbuf-2.0.so.

Di seguito mostriamo due modalità legate a detta soluzione, delle quali saranno mostrati due esempi che richiedono entrambi:

  • sia attivato comunque il componente gb.gtk3 (servirà per mostrare l'icona associata al tipo del file);
  • sia posta sul Form una PictureBox.

Prima modalità:

Library "libgtk-3:0.2404.29"

Private Enum GTK_ICON_LOOKUP_NO_SVG = 1,
             GTK_ICON_LOOKUP_FORCE_SVG = 2,
             GTK_ICON_LOOKUP_USE_BUILTIN = 4,
             GTK_ICON_LOOKUP_GENERIC_FALLBACK = 8,
             GTK_ICON_LOOKUP_FORCE_SIZE = 16

' void gtk_init(int * argc, utf8 * argv)
' Initializes GTK library.
Private Extern gtk_init(argc As Pointer, argv As Pointer)

' GtkIconTheme* gtk_icon_theme_get_default (void)
' Gets the icon theme for the default screen.
Private Extern gtk_icon_theme_get_default() As Pointer

' GtkIconInfo* gtk_icon_theme_lookup_by_gicon (GtkIconTheme *self, GIcon* icon, gint size, GtkIconLookupFlags flags)
' Looks up an icon and returns a structure containing information such as the filename of the icon.
Private Extern gtk_icon_theme_lookup_by_gicon(self As Pointer, icon As Pointer, size As Integer, flags As Integer) As Pointer

' const gchar* gtk_icon_info_get_filename (GtkIconInfo * icon_info)
' Gets the filename for the icon.
Private Extern gtk_icon_info_get_filename(icon_info As Pointer) As String


Library "libgio-2.0:0.7200.4"

' gchar * g_content_type_guess (const gchar *filename, const guchar *data, gsize data_size, gboolean *result_uncertain)
' Guesses the content type based on example data.
Private Extern g_content_type_guess(filename As String, data As Pointer, data_size As Integer, result_uncertain As Pointer) As Pointer

' GIcon * g_content_type_get_icon (const gchar *type)
' Gets the icon for a content type.
Private Extern g_content_type_get_icon(gtype As Pointer) As Pointer


Public Sub Form_Open()

 Dim tipo, bo, ico, info As Pointer
 Dim nomefile As String

 tipo = g_content_type_guess("/percorso/del/file", 0, 0, bo)
 Print "Il mime-type del file è: "; String@(tipo)

 gtk_init(0, 0)
 ico = g_content_type_get_icon(tipo)
 If ico == 0 Then Error.Raise("Impossibile ottenere l'icona del mime-type !")

 info = gtk_icon_theme_lookup_by_gicon(gtk_icon_theme_get_default(), ico, 48, GTK_ICON_LOOKUP_GENERIC_FALLBACK)

 nomefile = gtk_icon_info_get_filename(info)
 Print "Il file immagine dell'icona associata al tipo di file è: "; nomefile

 With PictureBox1
   .W = ImageStat(nomefile).Width
   .H = ImageStat(nomefile).Height
   .Picture = Picture[nomefile]
 End With

End

Seconda modalità:

Library "libgio-2.0:0.7200.4"

Private Enum G_FILE_QUERY_INFO_NONE = 0, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS

' GFile * g_file_new_for_path (const char *path)
' Constructs a GFile for a given path.
Private Extern g_file_new_for_path(path As String) As Pointer

' GFileInfo * g_file_query_info (GFile *file, const char *attributes, GFileQueryInfoFlags flags, GCancellable *cancellable, GError **error)
' Gets the requested information about specified file.
Private Extern g_file_query_info(GFile As Pointer, attributes As String, flags As Integer, cancellable As Pointer, GError As Pointer) As Pointer

' GIcon * g_file_info_get_icon (GFileInfo *info)
' Gets the icon for a file.
Private Extern g_file_info_get_icon(GFileInfo As Pointer) As Pointer

' gchar * g_icon_to_string (GIcon *icon)
' Generates a textual representation of icon that can be used for serialization.
Private Extern g_icon_to_string(GIcon As Pointer) As String


Library "libgtk-3:0.2404.29"

Private Enum GTK_ICON_LOOKUP_NO_SVG = 1,
             GTK_ICON_LOOKUP_FORCE_SVG = 2,
             GTK_ICON_LOOKUP_USE_BUILTIN = 4,
             GTK_ICON_LOOKUP_GENERIC_FALLBACK = 8,
             GTK_ICON_LOOKUP_FORCE_SIZE = 16

' void gtk_init(int * argc, utf8 * argv)
' Initializes GTK library.
Private Extern gtk_init(argc As Pointer, argv As Pointer)

' GtkIconTheme* gtk_icon_theme_get_default (void)
' Gets the icon theme for the default screen.
Private Extern gtk_icon_theme_get_default() As Pointer

' GtkIconInfo* gtk_icon_theme_lookup_by_gicon (GtkIconTheme *self, GIcon* icon, gint size, GtkIconLookupFlags flags)
' Looks up an icon and returns a structure containing information such as the filename of the icon.
Private Extern gtk_icon_theme_lookup_by_gicon(self As Pointer, icon As Pointer, size As Integer, flags As Integer) As Pointer

' const gchar* gtk_icon_info_get_filename (GtkIconInfo * icon_info)
' Gets the filename for the icon.
Private Extern gtk_icon_info_get_filename(icon_info As Pointer) As String


Public Sub Form_Open()

 Dim percorso, ico, nomefile As String
 Dim gfl, gfi, gic, info As Pointer

 percorso = "/percorso/del/file"
 
 gfl = g_file_new_for_path(percorso)
 If gfl == 0 Then Error.Raise("Impossibile caricare il file !")

 gfi = g_file_query_info(gfl, "standard::icon", G_FILE_QUERY_INFO_NONE, 0, 0)
 If gfi == 0 Then Error.Raise("Impossibile richiedere informazioni sul file !")

 gic = g_file_info_get_icon(gfi)
 If gic == 0 Then Error.Raise("Impossibile ottenere l'icona del file caricato !")

 ico = g_icon_to_string(gic)
 Print "La rappresentazione testuale dell'icona del file è:", ico
  
 gtk_init(0, 0)
  
 info = gtk_icon_theme_lookup_by_gicon(gtk_icon_theme_get_default(), gic, 48, GTK_ICON_LOOKUP_GENERIC_FALLBACK)
  
 nomefile = gtk_icon_info_get_filename(info)
 Print "Il file immagine dell'icona associata al tipo di file è: "; nomefile
  
 With PictureBox1
   .W = ImageStat(nomefile).Width
   .H = ImageStat(nomefile).Height
   .Picture = Picture[nomefile]
 End With
  
End

Terza modalità:

Library "libgio-2.0:0.7200.4"

Private Enum G_FILE_QUERY_INFO_NONE = 0, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS
Private Const G_FILE_ATTRIBUTE_STANDARD_ICON As String = "standard::icon"

' GFile * g_file_new_for_path (const char *path)
' Constructs a GFile for a given path.
Private Extern g_file_new_for_path(path As String) As Pointer

' GFileInfo * g_file_query_info (GFile *file, const char *attributes, GFileQueryInfoFlags flags, GCancellable *cancellable, GError **error)
' Gets the requested information about specified file.
Private Extern g_file_query_info(gfile As Pointer, attributes As String, flags As Integer, cancellable As Pointer, gerror As Pointer) As Pointer

' GIcon * g_file_info_get_icon (GFileInfo *info)
' Gets the icon for a file.
Private Extern g_file_info_get_icon(info As Pointer) As Pointer

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


Library "libgtk-3:0.2404.29"

Private Enum GTK_ICON_SIZE_INVALID = 0, GTK_ICON_SIZE_MENU, GTK_ICON_SIZE_SMALL_TOOLBAR, GTK_ICON_SIZE_LARGE_TOOLBAR,
             GTK_ICON_SIZE_BUTTON, GTK_ICON_SIZE_DND, GTK_ICON_SIZE_DIALOG
            
Private Enum GTK_ICON_LOOKUP_NO_SVG = 0, GTK_ICON_LOOKUP_FORCE_SVG, GTK_ICON_LOOKUP_USE_BUILTIN, GTK_ICON_LOOKUP_GENERIC_FALLBACK, GTK_ICON_LOOKUP_FORCE_SIZE,
             GTK_ICON_LOOKUP_FORCE_REGULAR, GTK_ICON_LOOKUP_FORCE_SYMBOLIC, GTK_ICON_LOOKUP_DIR_LTR, GTK_ICON_LOOKUP_DIR_RTL

' GtkIconTheme * gtk_icon_theme_get_default (void)
' Gets the icon theme for the default screen.
Private Extern gtk_icon_theme_new() As Pointer

' gboolean gtk_icon_size_lookup (GtkIconSize size, gint *width, gint *height)
' Obtains the pixel size of a semantic icon size size.
Private Extern gtk_icon_size_lookup(size As Integer, width As Pointer, height As Pointer) As Boolean

' GtkIconInfo * gtk_icon_theme_lookup_by_gicon (GtkIconTheme *icon_theme, GIcon *icon, gint size, GtkIconLookupFlags flags)
' Looks up an icon and returns a GtkIconInfo containing information such as the filename of the icon.
Private Extern gtk_icon_theme_lookup_by_gicon(icon_theme As Pointer, icon As Pointer, size As Integer, flags As Integer) As Pointer

' GdkPixbuf * gtk_icon_info_load_icon (GtkIconInfo *icon_info, GError **error)
' Renders an icon previously looked up in an icon theme using gtk_icon_theme_lookup_icon().
Private Extern gtk_icon_info_load_icon(icon_info As Pointer, gerror As Pointer) As Pointer


Library "libgdk_pixbuf-2.0:0.4200.8"

' gboolean gdk_pixbuf_save (GdkPixbuf *pixbuf, const char *filename, const char *type, GError **error, ...)
' Saves pixbuf to a file in format type.
Private Extern gdk_pixbuf_save(pixbuf As Pointer, filename As String, type As String, gerror As Pointer, ptr As Pointer) As Boolean


Public Sub Main()
 
 Dim gf, gfi, ico As Pointer
 Dim git, gii, pbuf As Pointer
 Dim w As Integer
 
 gf = g_file_new_for_path("/percorso/del/file")
 If gf == 0 Then Error.Raise("ERRORE !")
 
 gfi = g_file_query_info(gf, G_FILE_ATTRIBUTE_STANDARD_ICON, G_FILE_QUERY_INFO_NONE, 0, 0)
 If gfi == 0 Then Error.Raise("ERRORE !")
 
 ico = g_file_info_get_icon(gfi)
 If ico == 0 Then Error.Raise("ERRORE !")
 
 git = gtk_icon_theme_new()
 If git == 0 Then Error.Raise("ERRORE !")

 gtk_icon_size_lookup(GTK_ICON_SIZE_DIALOG, VarPtr(w), 0)
 
 gii = gtk_icon_theme_lookup_by_gicon(git, ico, w, GTK_ICON_LOOKUP_USE_BUILTIN)
 If gii == 0 Then Error.Raise("ERRORE !")

 pbuf = gtk_icon_info_load_icon(gii, 0)
 If pbuf == 0 Then Error.Raise("ERRORE !")

' Salva l'immagine dell'icona in un file immagine:
 gdk_pixbuf_save(pbuf, "/tmp/test.png", "png", 0, 0)
 
' Libera la memoria utilizzata con la libreria Libgio-2.0:
 g_object_unref(pbuf)
 g_object_unref(gii)
 g_object_unref(gfi)
 g_object_unref(gf)
 
End


Riferimenti