Differenze tra le versioni di "Scaricare una immagine da un sito internet"

Da Gambas-it.org - Wikipedia.
 
(51 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Di seguito vedremo un paio di modalità per scaricare dal WEB i dati di file immagini.
+
Vedremo di seguito alcune modalità per scaricare dal WEB i dati di file immagini, di cui si conoscono gli indirizzi web. <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
 +
=Usando le sole risorse e funzioni di Gambas=
 +
==Uso della Classe "HttpClient"==
 +
La Classe ''HttpClient'' andrà richiamata attivando i Componenti <i>gb.net</i> e <i>gb.net.curl</i>.
  
 +
===Con il Metodo ''statico'' ".Download()"===
 +
Public Sub Form_Open()
 +
 
 +
  Dim tp As New HttpClient
 +
  Dim s As String
 +
  Dim im As New Image
 +
 +
  s = tp.Download("<font color=darkgreen>''indirizzo/web/del/file/immagine/da/scaricare''</font>")
 +
 
 +
  tp.Close
 +
 
 +
  PictureBox1.Image = im.FromString(s)
 +
 
 +
End
 +
oppure senza creare un'istanza (''Oggetto'' ) della Classe "HttpClient":
 +
Public Sub Main()
 +
 +
  File.save("/tmp/prova.png", HttpClient.Download("https&#058;//www.gambas-it.org/wiki/resources/assets/gambas-wiki-logo.png"))
 +
 +
End
  
==Usando le sole risorse e funzioni di Gambas==
+
====Scaricare una immagine presente in una pagina web mediante il mouse e caricarla in una "PictureBoxx"====
L'esempio prevede il posizionamento sul Form di una <i>PictureBox</i> e di un <i>Button</i>, nonché l'attivazione dei componenti: <i>gb.net</i> e <i>gb.net.curl</i>:
+
In questo caso si utilizzerà anche la Classe ''Clipboard''.
Private myhttp As New HttpClient As "myhttp"
+
 
 +
Individuata in una pagina web l'immagine da scaricare, si cliccherà su di essa con il tasto ''destro'' del mouse. Apparirà la contestuale finestra menu, nella quale si sceglierà l'opzione "''Copia link immagine'' " (oppure "''Copia collegamento immagine'' "). Successivamente, per caricarla nella ''PictureBox'', si cliccherà con il tasto ''sinistro'' del mouse sulla ''PictureBox''.
 +
<BR>Nella routine dell'Evento "_MouseUp()" (oppure "_MouseDown()") della Classe ''PictureBox'' si porrà il riferimento ala classe ''Clipboard'' unitamente al suo Metodo ".Paste()", il quale passerà l'indirizzo web dell'immagine da scaricare, catturato - come esposto - con il mouse precedentemente.
 +
 
 +
Codice d'esempio:
 +
Public Sub PictureBox1_MouseUp()
 +
 +
  PictureBox1.Image = Image.FromString(HttpClient.Download(<FONT Color=red>Clipboard.Paste()</font>))
 +
 +
End
 +
 
 +
===Con il Metodo ".Get()"===
 +
Private ht As New HttpClient As "HttpClient1" 
 +
 +
 +
Public Sub Button1_Click()
 +
 +
  With ht
 +
<font color=gray>' <i>Invia la richiesta al server per scaricare il file immagine:</i></font>  <SUP>&#091;[[#Note|nota 2]]&#093;</sup>
 +
    .URL = "<FONT Color=darkgreen>''indirizzo/web/del/file/immagine/da/scaricare''</font>"
 +
    .Timeout = 15
 +
<FONT Color=gray>' ''Scarica i dati del file immagine e lo ricrea in una cartella prescelta:</font>
 +
    .Get(Null, "<font color=darkgreen>''/percorso/del/file/immagine/scaricato''</font>")
 +
  End With
 
    
 
    
 +
End 
 +
 +
 +
Public Sub HttpClient1_Finished() 
 +
   
 +
  ht.Close 
 +
   
 +
<font color=gray>' <i>Carica nella "PictureBox" il file immagine ricreato:</i></font>
 +
  PictureBox1.Picture = Picture["<font color=darkgreen>''/percorso/del/file/immagine/scaricato_e_ricreato''</font>"]
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  End
 +
oppure anche utilizzando l'Evento "_Read()":
 +
Private ht As New HttpClient As "HttpClient1" 
 +
Private stringa As String
 
   
 
   
  <font color=gray>' <i>Invia_richiesta al server per scaricare il file immagine:</i></font>  [<SUP>[[#Note|nota 1]]</sup>]
+
   
  myhttp.URL = "<font color=gray>''www.indirizzo.del.file.immagine.da.scaricare''</font>"
+
Public Sub Button1_Click()
 
 
  myhttp.Timeout = 15
 
 
    
 
    
  <FONT Color=gray>' ''Scarica i dati del file immagine in un percorso prescelto, contenente anche il nome del file immagine ricreato:</font>
+
  With ht
  myhttp.Get(Null, "<font color=gray>''/percorso/del/file/immagine/scaricato_e_ricreato''</font>")  
+
  <font color=gray>' <i>Invia la richiesta al server per scaricare il file immagine:</i></font>  <Font Color=gray>'</font> <SUP>&#091;[[#Note|nota 2]]&#093;</sup>
 +
    .URL = "<font color=darkgreen>''indirizzo/web/del/file/immagine/da/scaricare''</font>"
 +
    .Timeout = 15 
 +
    .Get()
 +
  End With
 
        
 
        
  <b>End</b>   
+
End
    
+
 +
 +
Public Sub HttpClient1_Read() 
 +
 +
  Dim sBuf As String 
 +
 +
  <font color=gray>' <i>Legge il flusso di dati del file immagine:</i></font>
 +
  If Lof(ht) Then 
 +
    Read #ht, sBuf, Lof(ht)
 +
    stringa &amp;= sBuf
 +
  End If
 +
 +
End
 +
 +
 +
Public Sub HttpClient1_Finished() 
 +
 +
  Label1.Text = ("Immagine scaricata&nbsp;!") 
 +
 +
  Wait 
 +
 +
  ht.Close
 +
 +
<font color=gray>' <i>Ricrea il file:</i>  '</font> <SUP>&#091;[[#Note|nota 3]]&#093;</sup>
 +
  File.Save("<font color=darkgreen>''/percorso/del/file/ricreato''</font>", stringa)
 +
   
 +
<font color=gray>' <i>Carica nella "PictureBox" il file immagine ricreato:</i></font>
 +
   PictureBox1.Picture = Picture["<font color=darkgreen>''/percorso/del/file/ricreato''</font>"]
 
   
 
   
  <b>Public</b> Sub MyHTTP_Finished() 
+
  <FONT Color=gray>' ''Oppure più direttamente:''
   
+
' '''PictureBox1.Image = im.FromString(stringa)'''</font>
  MyHTTP.Close 
 
   
 
<font color=gray>' <i>Carichiamo nella "PictureBox" il file immagine ricreato:</i></font>
 
  PictureBox1.Picture = Picture["<font color=gray>''''/percorso/del/file/immagine/scaricato_e_ricreato''</font>"]
 
 
   
 
   
  <b>End</b>
+
  End
 +
 
 +
 
 +
==Scaricare, mostrare e salvare un'immagine da un sito internet mediante il Controllo ''WebView''==
 +
 
 +
===Cercare nel codice HTML di una pagina web l'indirizzo di un file immagine per poi scaricarlo===
 +
Le pagine web possono, come sappiamo, contenere - fra l'altro - anche immagini, il cui indirizzo web è comunque presente anche nel codice HTML della pagina web che le contiene.
  
 +
In questo paragrafo cercheremo l'indirizzo HTML di un file immagine, usando il Metodo ".GetHtml()" del Controllo ''WebView''. Quindi si provvederà a scaricare i dati di tale file immagine e di rigenerarlo in una cartella.
  
oppure anche utilizzando l'evento ''_Read()'':
+
Mostriamo un esempio, nel quale poniamo il caso di conoscere il nome dell'immagine da scaricare (è necessario attivare anche i Component ''gb.net'' e ''gb.net.curl''):
  Private myhttp As New HttpClient As "myhttp"   
+
  Private WebView1 As WebView
  Private stringa As String
+
Private miohttp As New HttpClient As "Miohttp"
 +
 +
 +
  Public Sub Button1_Click()
 +
   
 +
  With WebView1 = New WebView(Me) As "WebView1"
 +
    .Url = "https&#058;//www.gambas-it.org/smf/"
 +
  End With
 +
 +
End
 +
 +
 +
Public Sub WebView1_Finish()
 
   
 
   
 +
  Dim percorso As String
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  <FONT Color=gray>' ''Individua l'indirizzo web dell'immagine, tenendo conto del suo nome conosciuto:''</font>
 +
  percorso = Scan(WebView1.GetHtml(), "*img src=\"*logo2.png*")[1] &/ "logo2.png"
 
   
 
   
  <font color=gray>' <i>Invia_richiesta al server per scaricare il file immagine:</i></font>   [<SUP>[[#Note|nota 1]]</sup>]
+
  With miohttp
  myhttp.URL = "''www.indirizzo.del.file.immagine.da.scaricare''"
+
    If .Status == Net.Inactive Then
 
+
      .URL = percorso
  myhttp.Timeout = 15 
+
      .Timeout = 15
  myhttp.Get()  
+
  <FONT Color=gray>' ''Scarica i dati e ricrea il file immagine nella cartella temporale:''</font>
     
+
      .Get(Null, "/tmp" &/ File.Name(percorso))
<b>End</b> 
+
    Endif
 
+
  End With
 
   
 
   
  <b>Public</b> Sub myhttp_Read() 
+
  End
     
 
  Dim sBuf As String 
 
   
 
<font color=gray>' <i>Andiamo a leggere il flusso di dati del file immagine:</i></font>
 
    If Lof(MyHTTP) Then 
 
      Read #MyHTTP, sBuf, Lof(MyHTTP)
 
      stringa = stringa &amp; sBuf
 
    End If
 
 
   
 
   
<b>End</b>
 
 
   
 
   
 +
Public Sub Miohttp_Finished() 
 
   
 
   
<b>Public</b> Sub MyHTTP_Finished() 
+
  miohttp.Close
   
 
  Label1.Text = ("Immagine scaricata&nbsp;!") 
 
       
 
  Wait 
 
       
 
 
   
 
   
  MyHTTP.Close  
+
End
             
+
 
 +
 
 +
==Mostrare un file immagine presente in una pagina internet==
 +
In questo caso non sarà possibile gestire direttamente i dati del file immagine, ma si provvedere più semplicemente a mostrare il file immagine presente in una pagina web.
 +
 
 +
===Uso del Metodo "Desktop.Open()"===
 +
Questa procedura (è necessario attivare il Componente ''gb.desktop'') prevede l'utilizzo del solo codice Gambas, ma prevede che il file immagine sia aperto dal programma preimpostato (in tal caso dal web-browser) nel nostro sistema per l'apertura, appunto, dei file immagine:
 +
  Public Sub Button1_Click()
 
   
 
   
<font color=gray>' <i>Ricreiamo il file:</i></font> [<SUP>[[#Note|nota 2]]</sup>]
+
  Desktop.Open("<FONT Color=gray>''indirizzo/web/del/file/immagine/da/scaricare''</font>")
  File.Save("''/percorso/del/file/ricreato''", stringa)
 
 
   
 
   
 +
End
 +
 +
===Usando la Classe "URLLabel"===
 +
Effetto simile a quello precedente si ottiene usando un Oggetto della Classe "URLLabel".
 +
<BR>E' necessario attivare anche il Componente ''gb.desktop''.
 +
Public Sub Form_Open()
 
   
 
   
  <font color=gray>' <i>Carichiamo nella "PictureBox" il file immagine ricreato:</i></font>
+
  With URLLabel1
  PictureBox1.Picture = Picture["''/percorso/del/file/ricreato''"]
+
    .Link = "https&#058;//www.gambas-it.org/wiki/resources/assets/gambas-wiki-logo.png"
 +
  <FONT Color=gray>' ''Cliccando sul testo del collegamento si aprirà nel web-browser l'immagine web impostata:''</font>
 +
    .Text = "Mostra l'immagine della Wiki del foro www.gabas-org.it"
 +
  End With
 
   
 
   
  <b>End</b>
+
  End
  
  
 +
=Usando le risorse di librerie esterne=
 
==Usando le funzioni esterne della libreria ''Libcurl''==
 
==Usando le funzioni esterne della libreria ''Libcurl''==
 
'''Libcurl''' è una libreria gratuita lato-client di trasferimento dati con la sintassi URL, capace di supportare diversi protocolli.
 
'''Libcurl''' è una libreria gratuita lato-client di trasferimento dati con la sintassi URL, capace di supportare diversi protocolli.
  
Per poter fruire in Gambas delle risorse della libreria ''Libcurl'', è necessario avere installata nel sistema e richiamare la libreria dinamica condivisa: "''libcurl.so''"
+
Per poter fruire in Gambas delle risorse della libreria ''Libcurl'', è necessario avere installata nel sistema e richiamare la libreria condivisa: "''libcurl.so.4.8.0'' ".
 
 
  
 
Mostriamo un esempio pratico, nel quale immaginiamo di dover scaricare un file immagine di formato .png:
 
Mostriamo un esempio pratico, nel quale immaginiamo di dover scaricare un file immagine di formato .png:
  Library "libcurl"
+
  Library "libcurl:4.8.0"
 
   
 
   
 
  Private Const CURLOPT_WRITEDATA As Integer = 10001
 
  Private Const CURLOPT_WRITEDATA As Integer = 10001
 
  Private Const CURLOPT_URL As Integer = 10002
 
  Private Const CURLOPT_URL As Integer = 10002
   
+
 
  <FONT Color=gray>' ''CURL *curl_easy_init(void)''
 
  <FONT Color=gray>' ''CURL *curl_easy_init(void)''
 
  ' ''Start a libcurl easy session.''</font>
 
  ' ''Start a libcurl easy session.''</font>
Riga 123: Riga 229:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
   Dim cu, url, fl As Pointer
+
   Dim url, cu, fl As Pointer
 
   Dim file_finale As String
 
   Dim file_finale As String
 
   Dim ris As Integer
 
   Dim ris As Integer
 
+
 
  <FONT Color=gray>' ''Imposta l'indirizzo web del file immagine .png da scaricare:''</font>
 
  <FONT Color=gray>' ''Imposta l'indirizzo web del file immagine .png da scaricare:''</font>
  url = Alloc("<FONT Color=gray>''http:&#047;/indirizzo/web/del/file.png''</font>")
+
  url = Alloc("<FONT Color=darkgreen>''indirizzo/web/del/file.png''</font>")
 
+
 
  <FONT Color=gray>' ''Imposta il percorso del nuovo file immagine generato con i dati del file immagine scaricato:''</font>
 
  <FONT Color=gray>' ''Imposta il percorso del nuovo file immagine generato con i dati del file immagine scaricato:''</font>
  file_finale = "<FONT Color=gray>''/percorso/del/nuovo/file.png''</font>"
+
  file_finale = "<FONT Color=gray>''/percorso/del/nuovo/file.png''</font>"
   
+
 
  <FONT Color=gray>' ''Inizilizza la libreria ''Libcurl':''</font>
 
  <FONT Color=gray>' ''Inizilizza la libreria ''Libcurl':''</font>
  cu = curl_easy_init()
+
  cu = curl_easy_init()
  If cu = 0 Then Error.Raise("Impossibile inizializzare la libreria 'curl' !")
+
  If cu == 0 Then Error.Raise("Impossibile inizializzare la libreria 'curl' !")
 
+
  curl_easy_setopt(cu, CURLOPT_URL, url)
+
  curl_easy_setopt(cu, CURLOPT_URL, url)
   
+
 
  <FONT Color=gray>' ''Apre in scrittura il percorso del nuovo file immagine .png da salvare:''</font>
 
  <FONT Color=gray>' ''Apre in scrittura il percorso del nuovo file immagine .png da salvare:''</font>
  fl = fopen(file_finale, "wb")
+
  fl = fopen(file_finale, "wb")
   
+
  If fl == 0 Then Error.Raise("Errore !")
 +
 
  <FONT Color=gray>' ''Scrive i dati scaricati del file nella variabile handle per la gestione del nuovo file immagine .png da salvare:''</font>
 
  <FONT Color=gray>' ''Scrive i dati scaricati del file nella variabile handle per la gestione del nuovo file immagine .png da salvare:''</font>
  curl_easy_setopt(cu, CURLOPT_WRITEDATA, fl)
+
  curl_easy_setopt(cu, CURLOPT_WRITEDATA, fl)
 
+
 
  <FONT Color=gray>' ''Scrive il nuovo file immagine .png :''</font>
 
  <FONT Color=gray>' ''Scrive il nuovo file immagine .png :''</font>
  ris = curl_easy_perform(cu)
+
  ris = curl_easy_perform(cu)
  If ris <> 0 Then Error.Raise("Errore nella scrittura del file: " & curl_easy_strerror(i))
+
  If ris <> 0 Then Error.Raise("Errore nella scrittura del file: " & curl_easy_strerror(ris))
   
+
   
 
 
  <FONT Color=gray>' ''Va in chiusura e libera tutta la memoria precedentemente allocata:''</font>
 
  <FONT Color=gray>' ''Va in chiusura e libera tutta la memoria precedentemente allocata:''</font>
  fclose(pagina)
+
  fclose(fl)
  Free(url)
+
  Free(url)
  curl_easy_cleanup(cu)
+
  curl_easy_cleanup(cu)
 
+
  '''End'''
+
  End
  
 +
==Usando le funzioni esterne della libreria ''libgdk_pixbuf-2.0''==
 +
In questo caso l'immagine da scaricare <SPAN Style="text-decoration:underline">deve avere il canale Alfa</span> e dunque deve essere di formato a 32-bit - RGBA.
 +
<BR>Per utilizzare alcune funzioni esterne di ''gdk_pixbuf'', si dovrà richiamando nel progetto Gambas la libreria condivisa: "''libgdk_pixbuf-2.0.so.0.4200.12'' ".
  
=Usando Shell ed il comando ''wget''=
+
Mostriamo di seguito il codice con un esistente indirizzo web di un'immagine ''PNG'' da scaricare (è necessario attivare anche i Componenti "gb.net" e "gb.net.curl").
Nell'esempio che segue sul Form del programma saranno posti semplicemente una <i>PictureBox</i> ed un <i>Button</i>. Scaricheremo un'immagine da un sito internet mediante <i><font color="#B22222">wget</font></i> (che sarà lanciato nel nostro programma mediante il comando <i>Shell</i>), e successivamente la caricheremo nella <i>PictureBox</i>:
+
Private myhttp As New HttpClient As "myhttp" 
  '''Public''' Sub Button1_Click()
+
 +
 +
Library "libgdk_pixbuf-2.0:0.4200.12"
 +
 +
<FONT Color=gray>' ''GdkPixbufLoader * gdk_pixbuf_loader_new(void)''
 +
' ''Creates a new pixbuf loader object.''</font>
 +
Private Extern gdk_pixbuf_loader_new() As Pointer
 +
 +
<FONT Color=gray>' ''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.''</font>
 +
Private Extern gdk_pixbuf_loader_write(lo As Pointer, buf As Pointer, i As Integer, po As Pointer)
 +
 +
<FONT Color=gray>' ''gboolean gdk_pixbuf_loader_close (GdkPixbufLoader *loader, GError **error)'
 +
' ''Informs a pixbuf loader that no further writes.''</font>
 +
Private Extern gdk_pixbuf_loader_close(lo As Pointer, po As Pointer)
 +
 +
<FONT Color=gray>' ''GdkPixbuf * gdk_pixbuf_loader_get_pixbuf (GdkPixbufLoader *loader)'
 +
' ''Queries the GdkPixbuf that a pixbuf loader is currently creating.''</font>
 +
Private Extern gdk_pixbuf_loader_get_pixbuf(lo As Pointer) As Pointer
 +
 +
<FONT Color=gray>' ''guchar * gdk_pixbuf_get_pixels (const GdkPixbuf *pixbuf)'
 +
' ''Queries a pointer to the pixel data of a pixbuf.''</font>
 +
Private Extern gdk_pixbuf_get_pixels(GdkPixbuf As Pointer) As Pointer
 +
 +
<FONT Color=gray>' ''int gdk_pixbuf_get_width (const GdkPixbuf *pixbuf)'
 +
' ''Queries the width of a pixbuf.''</font>
 +
Private Extern gdk_pixbuf_get_width(GdkPixbuf As Pointer) As Integer
 +
 +
<FONT Color=gray>' ''int gdk_pixbuf_get_height (const GdkPixbuf *pixbuf)'
 +
' ''Queries the height of a pixbuf.''</font>
 +
Private Extern gdk_pixbuf_get_height(GdkPixbuf As Pointer) As Integer
 +
 +
<FONT Color=gray>' ''int gdk_pixbuf_get_n_channels (const GdkPixbuf *pixbuf)'
 +
' ''Queries the number of channels of a pixbuf.''</font>
 +
Private Extern gdk_pixbuf_get_n_channels(GdkPixbuf As Pointer) As Integer
 +
 +
<FONT Color=gray>' ''gboolean gdk_pixbuf_get_has_alpha (const GdkPixbuf *pixbuf)'
 +
' ''Queries whether a pixbuf has an alpha channel (opacity information).''</font>
 +
Private Extern gdk_pixbuf_get_has_alpha(GdkPixbuf As Pointer) As Boolean
 +
 +
 +
Public Sub Button1_Click()
 +
 
 +
<FONT Color=gray>' ''Invia la richiesta al server per scaricare un file immagine:''</font>
 +
  myhttp.URL = "https&#058;//www.freepnglogos.com/uploads/eye-png/eye-psd-vector-vectorhqm-18.png"
 +
  myhttp.Timeout = 15
 +
 +
<FONT Color=gray>' ''Lasciando il secondo parametro vuoto, i dati dell'immagine vengono salvati soltanto in memoria:''</font>
 +
  myhttp.Get()
 +
   
 +
End
 +
 +
 +
Public Sub MyHTTP_Finished()
 +
 +
  Dim s As String
 +
 +
  MyHTTP.Close
 +
 
 +
  <FONT Color=gray>' ''Trasferiamo in una variabile stringa i dati dell'immagine scaricata e salvata in memoria:''</font>
 +
  s = myhttp.Peek()
 +
  Print "Immagine scaricata !\n\nDimensione: "; Len(s); " byte"
 +
 
 +
  Immagine(s)
 +
 
 +
End
 
   
 
   
<font color=gray>' <i>Scarichiamo l'immagine dal sito web:</i></font>
 
  Shell "wget http:/&#47;indirizzo_web_dell'_immagine_da_scaricare --directory-prefix <FONT Color=gray>''/percorso/ove/l'immagine/sarà/scaricata''</font>" Wait [<SUP>[[#Note|nota 4]]</sup>]
 
 
   
 
   
  <font color=gray>' <i>Carichiamo l'immagine nella PictureBox:</i></font>
+
  Private Procedure Immagine(im As String)
  PictureBox1.Picture = Picture["<FONT Color=gray>''/percorso/ove/l'immagine/è/stata/scaricata"''</font>]
 
 
   
 
   
  '''End'''
+
  Dim bb, bb2 As Byte[]
 +
  Dim w, h As Integer
 +
  Dim loader, pixbuf, dati As Pointer
 +
  Dim c As Byte
 +
  Dim bo As Boolean
 +
  Dim st As Stream
 +
  Dim immago As Image
 +
 
 +
  bb = Byte[].FromString(im)
 +
 
 +
  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"
 +
  c = gdk_pixbuf_get_n_channels(Pixbuf)
 +
  Print "Canali:    "; c
 +
 
 +
  <FONT Color=gray>' ''Verifichiamo che l'immagine scaricata abbia il canale Alfa:''</font>
 +
  bo = gdk_pixbuf_get_has_alpha(Pixbuf)
 +
  If bo = False Then Error.Raise("L'immagine scaricata è priva del canale Alfa !")
 +
 
 +
  dati = gdk_pixbuf_get_pixels(Pixbuf)
 +
  If dati == 0 Then Error.Raise("Impossibile ottenere un 'Puntatore' ai dati dei pixel dell'immagine !")
 +
 
 +
<FONT Color=gray>' ''Carichiamo i dati nel vettore "bb[]" per gestire successivamente i dati grezzi dei pixel:''</font>
 +
  st = Memory dati For Read
 +
 
 +
  With bb = New Byte[w * h * c]
 +
    .Read(st, 0, .count)
 +
  End With
 +
 
 +
<FONT Color=gray>' ''Effettua la correzione della disposizione dei dati RGB dei pixel dell'immagine scaricata:''</font>
 +
  bb2 = Corregge(bb)
 +
 
 +
  st.Close
 +
 
 +
<FONT Color=gray>' ''Viene preparata la variabile di tipo Image per la gestione dei dati del futuro nuovo file immagine:''</font>
 +
  With immago = New Image(w, h, 0, 0)
 +
    st = Memory .Data For Write
 +
  End With
 +
 
 +
<FONT Color=gray>' ''Scrive i dati presenti nel vettore "bb[]" nell'area di memoria puntata dal Puntatore ".Data" della variabile di tipo "Image":''</font>
 +
  bb2.Write(st, 0, bb2.Count)
 +
 
 +
  st.Close
 +
 
 +
  With PictureBox1
 +
    .W = w
 +
    .H = h
 +
    .Image = immago
 +
  End With
 +
 
 +
End
 +
 +
 +
Private Function Corregge(vett As Byte[]) As Byte[]
 +
 
 +
  Dim i As Integer
 +
  Dim bb As Byte[]
 +
 
 +
  bb = New Byte[vett.Count]
 +
 
 +
  For i = 0 To vett.Max Step 4
 +
    bb[i + 1] = vett[i + 1]
 +
    bb[i + 2] = vett[i]
 +
    bb[i] = vett[i + 2]
 +
    bb[i + 3] = vett[i + 3]
 +
  Next
 +
 
 +
  Return bb
 +
 
 +
End
  
 
+
==Usando Shell ed il comando ''wget''==
 
+
Nell'esempio che segue sul Form del programma saranno posti semplicemente una <i>PictureBox</i> ed un <i>Button</i>. Scaricheremo un'immagine da un sito internet mediante <i><font color="#B22222">wget</font></i> (che sarà lanciato nel nostro programma mediante il comando <i>Shell</i>), e successivamente la caricheremo nella <i>PictureBox</i>:
=Mostrare un file presente in una pagina internet=
+
  Public Sub Button1_Click()
In questo caso non sarà possibile gestire direttamente i dati del file immagine, ma si provvedere più semplicemente a mostrare il file immagine presente in una pagina web.
 
 
 
==Uso del Metodo ''Desktop.Open( )''==
 
Questa procedura (è necessario attivare il componente ''gb.desktop'') prevede l'utilizzo del solo codice Gambas, ma prevede che il file immagine sia aperto dal programma preimpostato nel nostro sistema per l'apertura, appunto, dei file immagine:
 
  '''Public''' Sub Button1_Click()
 
 
   
 
   
  Desktop.Open("<FONT Color=gray>''www.indirizzo.del.file.immagine.da.scaricare''</font>")
+
<font color=gray>' ''Scarica l'immagine dal sito web.''
 +
' ''L'informazione sul percorso, ove sarà scaricata l'immagine, non deve contenere il nome finale dell'immagine (solo il percorso della/e cartella/e).''
 +
' ''Inoltre il Processo del comando "wget" lanciato dall'istruzione "Shell" verrà aperto in "Lettura" per ottenere in console i messaggi inviati dal predetto Processo.''</font>
 +
  Shell "wget <FONT Color=darkgreen>''indirizzo/web/della/immagine/da/scaricare''</font> --directory-prefix <FONT Color=gray>''/percorso/ove/l'immagine/sarà/scaricata''</font>" For '''Input''' As "Processo" <font color=gray>'</font><SUP>&#091;[[#Note|nota 4]]&#093;</sup>
 
   
 
   
  '''End'''
+
  End
 
 
 
 
 
 
==Utilizzo del codice HTML==
 
Si potrà effettuare il collegamento ad un file immagine richiamandolo:
 
 
 
a) da un'oggetto che permette l'utilizzo del [[Controlli_e_finestre_che_supportano_il_codice_HTML|codice html]]:
 
'''Public''' Sub Button1_Click()
 
 
   
 
   
  Message.Info("&lt;A HREF=\"http:/&#47;indirizzo_web_dell'_immagine_da_mostrare\"&gt;Clicca qui per vedere l'immagine&lt;/a&gt;")
 
 
   
 
   
  '''End'''
+
  Public Sub Processo_Read()
In questo caso, però, l'immagine sarà aperta e mostrata nel proprio web-browser, e pertanto la procedura anche qui sarà ''indiretta''.  [<SUP>[[#Note|nota 3]]</sup>]
 
 
 
b) da un oggetto specifico, che supporta il codice html, come la [[Controlli_e_finestre_che_supportano_il_codice_HTML#L.27oggetto_WebView|<I>WebView</i>]]. In tal caso è necessario attivare, come si sa, anche il componente <i>gb.qt4.webkit:</i>
 
'''Public''' Sub Form_Open()
 
 
   
 
   
  WebView1.Html = "&lt;HTML&gt;&lt;A HREF='&#104;ttp://www.indirizzo_web_immagine'&gt;Collegamento ipertestuale con l'immagine da mostrare.&lt;/a&gt;&lt;/html&gt;" 
+
  Dim s As String
 
   
 
   
<b>End</b>
+
  Line Input #Last, s
Nella <i>WebView</i> verrà mostrato il testo, sul quale si dovrà cliccare per far apparire l'immagine.
 
 
 
 
 
Se si vuole far apparire l'immagine direttamente, senza dover cliccare su un ipertesto, allora il codice sarà il seguente:
 
'''Public''' Sub Form_Open() 
 
 
   
 
   
  WebView1.Html = "&lt;HTML&gt;&lt;IMG SRC='&#104;ttp://www.indirizzo_web_immagine'&gt;Eventuale testo&lt;/img&gt;&lt;/html&gt;" 
+
  Print s
 
   
 
   
  '''End'''
+
  End
 
 
 
 
==Usando la la proprietà "''.Url''" dell'oggetto ''WebView''==
 
Si potrà usare anche la proprietà "''.Url''" dell'oggetto ''WebView'':
 
WebView1.Url = "&#104;ttp://www.indirizzo_web_immagine"
 
 
 
  
  
  
 
=Note=
 
=Note=
[1] In vero, con questa metodo è possibile scaricare qualsiasi tipo di file.
+
[1] Vedere anche la seguente pagina: [[Ottenere un'immagine di una pagina web]]
  
[2] E' possibile ricreare <i>utilmente</i> con questo metodo qualsiasi tipo di file.
+
[2] In vero, con questa metodo è possibile scaricare qualsiasi tipo di file.
  
[3] In questo caso sarà possibile soltanto <i>utilizzare</i> il file (dunque trattandosi di file immagine, <span style="text-decoration:underline">visualizzarla</span>), al quale ci si è collegati via internet, e non sarà possibile direttamente ottenerne una copia indipendente da salvare.
+
[3] E' possibile ricreare <i>utilmente</i> con questo metodo qualsiasi tipo di file.
  
 
[4] Se si vuole inserire l'immagine in una nuova cartella da creare, questa deve essere aggiunta alla fine del pecorso ove si intende scaricare il file:
 
[4] Se si vuole inserire l'immagine in una nuova cartella da creare, questa deve essere aggiunta alla fine del pecorso ove si intende scaricare il file:

Versione attuale delle 07:51, 22 lug 2024

Vedremo di seguito alcune modalità per scaricare dal WEB i dati di file immagini, di cui si conoscono gli indirizzi web. [nota 1]

Usando le sole risorse e funzioni di Gambas

Uso della Classe "HttpClient"

La Classe HttpClient andrà richiamata attivando i Componenti gb.net e gb.net.curl.

Con il Metodo statico ".Download()"

Public Sub Form_Open()
 
 Dim tp As New HttpClient
 Dim s As String
 Dim im As New Image

 s = tp.Download("indirizzo/web/del/file/immagine/da/scaricare")
  
 tp.Close
  
 PictureBox1.Image = im.FromString(s)
 
End

oppure senza creare un'istanza (Oggetto ) della Classe "HttpClient":

Public Sub Main()

 File.save("/tmp/prova.png", HttpClient.Download("https://www.gambas-it.org/wiki/resources/assets/gambas-wiki-logo.png"))

End

Scaricare una immagine presente in una pagina web mediante il mouse e caricarla in una "PictureBoxx"

In questo caso si utilizzerà anche la Classe Clipboard.

Individuata in una pagina web l'immagine da scaricare, si cliccherà su di essa con il tasto destro del mouse. Apparirà la contestuale finestra menu, nella quale si sceglierà l'opzione "Copia link immagine " (oppure "Copia collegamento immagine "). Successivamente, per caricarla nella PictureBox, si cliccherà con il tasto sinistro del mouse sulla PictureBox.
Nella routine dell'Evento "_MouseUp()" (oppure "_MouseDown()") della Classe PictureBox si porrà il riferimento ala classe Clipboard unitamente al suo Metodo ".Paste()", il quale passerà l'indirizzo web dell'immagine da scaricare, catturato - come esposto - con il mouse precedentemente.

Codice d'esempio:

Public Sub PictureBox1_MouseUp()

 PictureBox1.Image = Image.FromString(HttpClient.Download(Clipboard.Paste()))

End

Con il Metodo ".Get()"

Private ht As New HttpClient As "HttpClient1"  


Public Sub Button1_Click()

 With ht
' Invia la richiesta al server per scaricare il file immagine:   [nota 2]
   .URL = "indirizzo/web/del/file/immagine/da/scaricare"
   .Timeout = 15
' Scarica i dati del file immagine e lo ricrea in una cartella prescelta:
   .Get(Null, "/percorso/del/file/immagine/scaricato")
 End With
  
End  


Public Sub HttpClient1_Finished()  
    
  ht.Close  
   
' Carica nella "PictureBox" il file immagine ricreato:
  PictureBox1.Picture = Picture["/percorso/del/file/immagine/scaricato_e_ricreato"]

End

oppure anche utilizzando l'Evento "_Read()":

Private ht As New HttpClient As "HttpClient1"  
Private stringa As String


Public Sub Button1_Click()
 
 With ht
' Invia la richiesta al server per scaricare il file immagine:   ' [nota 2]
   .URL = "indirizzo/web/del/file/immagine/da/scaricare"
   .Timeout = 15  
   .Get()
 End With
     
End


Public Sub HttpClient1_Read()  

 Dim sBuf As String  

' Legge il flusso di dati del file immagine:
 If Lof(ht) Then   
   Read #ht, sBuf, Lof(ht)
   stringa &= sBuf
 End If

End


Public Sub HttpClient1_Finished()  

 Label1.Text = ("Immagine scaricata !")  

 Wait   

 ht.Close

' Ricrea il file:   ' [nota 3]
 File.Save("/percorso/del/file/ricreato", stringa)

' Carica nella "PictureBox" il file immagine ricreato:
 PictureBox1.Picture = Picture["/percorso/del/file/ricreato"]

' Oppure più direttamente:
' PictureBox1.Image = im.FromString(stringa)

End


Scaricare, mostrare e salvare un'immagine da un sito internet mediante il Controllo WebView

Cercare nel codice HTML di una pagina web l'indirizzo di un file immagine per poi scaricarlo

Le pagine web possono, come sappiamo, contenere - fra l'altro - anche immagini, il cui indirizzo web è comunque presente anche nel codice HTML della pagina web che le contiene.

In questo paragrafo cercheremo l'indirizzo HTML di un file immagine, usando il Metodo ".GetHtml()" del Controllo WebView. Quindi si provvederà a scaricare i dati di tale file immagine e di rigenerarlo in una cartella.

Mostriamo un esempio, nel quale poniamo il caso di conoscere il nome dell'immagine da scaricare (è necessario attivare anche i Component gb.net e gb.net.curl):

Private WebView1 As WebView
Private miohttp As New HttpClient As "Miohttp"


Public Sub Button1_Click()

 With WebView1 = New WebView(Me) As "WebView1"
   .Url = "https://www.gambas-it.org/smf/"
 End With

End


Public Sub WebView1_Finish()

 Dim percorso As String

' Individua l'indirizzo web dell'immagine, tenendo conto del suo nome conosciuto:
 percorso = Scan(WebView1.GetHtml(), "*img src=\"*logo2.png*")[1] &/ "logo2.png"

 With miohttp
   If .Status == Net.Inactive Then
     .URL = percorso
     .Timeout = 15
' Scarica i dati e ricrea il file immagine nella cartella temporale:
     .Get(Null, "/tmp" &/ File.Name(percorso))
   Endif
 End With

End


Public Sub Miohttp_Finished()  

 miohttp.Close 

End


Mostrare un file immagine presente in una pagina internet

In questo caso non sarà possibile gestire direttamente i dati del file immagine, ma si provvedere più semplicemente a mostrare il file immagine presente in una pagina web.

Uso del Metodo "Desktop.Open()"

Questa procedura (è necessario attivare il Componente gb.desktop) prevede l'utilizzo del solo codice Gambas, ma prevede che il file immagine sia aperto dal programma preimpostato (in tal caso dal web-browser) nel nostro sistema per l'apertura, appunto, dei file immagine:

Public Sub Button1_Click()

 Desktop.Open("indirizzo/web/del/file/immagine/da/scaricare")

End

Usando la Classe "URLLabel"

Effetto simile a quello precedente si ottiene usando un Oggetto della Classe "URLLabel".
E' necessario attivare anche il Componente gb.desktop.

Public Sub Form_Open()

 With URLLabel1
   .Link = "https://www.gambas-it.org/wiki/resources/assets/gambas-wiki-logo.png"
' Cliccando sul testo del collegamento si aprirà nel web-browser l'immagine web impostata:
   .Text = "Mostra l'immagine della Wiki del foro www.gabas-org.it"
 End With 

End


Usando le risorse di librerie esterne

Usando le funzioni esterne della libreria Libcurl

Libcurl è una libreria gratuita lato-client di trasferimento dati con la sintassi URL, capace di supportare diversi protocolli.

Per poter fruire in Gambas delle risorse della libreria Libcurl, è necessario avere installata nel sistema e richiamare la libreria condivisa: "libcurl.so.4.8.0 ".

Mostriamo un esempio pratico, nel quale immaginiamo di dover scaricare un file immagine di formato .png:

Library "libcurl:4.8.0"

Private Const CURLOPT_WRITEDATA As Integer = 10001
Private Const CURLOPT_URL As Integer = 10002

' CURL *curl_easy_init(void)
' Start a libcurl easy session.
Private Extern curl_easy_init() As Pointer

' CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...)
' Set options for a curl easy handle
Private Extern curl_easy_setopt(curl As Pointer, optionI As Integer, optionP As Pointer) As Integer
 
' CURLcode curl_easy_perform(CURL *curl)
' Perform a blocking file transfer.
Private Extern curl_easy_perform(curl As Pointer) As Pointer

' const char *curl_easy_strerror(CURLcode)
' Turn a CURLcode value into the equivalent human readable error string.
Private Extern curl_easy_strerror(CURLcode As Integer) As String

' void curl_easy_cleanup(CURL *curl)
' End a libcurl easy handle.
Private Extern curl_easy_cleanup(curl As Pointer)


Library "libc:6"

' FILE *fopen (const char *__restrict __filename, const char *__restrict __modes)
' Open a file and create a new stream for it.
Private Extern fopen(__filename As String, __modes As String) As Pointer

' int fclose (FILE *__stream)
' Close STREAM.
Private Extern fclose(__stream As Pointer) As Integer


Public Sub Main()

 Dim url, cu, fl As Pointer
 Dim file_finale As String
 Dim ris As Integer

' Imposta l'indirizzo web del file immagine .png da scaricare:
 url = Alloc("indirizzo/web/del/file.png")

' Imposta il percorso del nuovo file immagine generato con i dati del file immagine scaricato:
 file_finale = "/percorso/del/nuovo/file.png"

' Inizilizza la libreria Libcurl':
 cu = curl_easy_init()
 If cu == 0 Then Error.Raise("Impossibile inizializzare la libreria 'curl' !")

 curl_easy_setopt(cu, CURLOPT_URL, url)

' Apre in scrittura il percorso del nuovo file immagine .png da salvare:
 fl = fopen(file_finale, "wb")
 If fl == 0 Then Error.Raise("Errore !")

' Scrive i dati scaricati del file nella variabile handle per la gestione del nuovo file immagine .png da salvare:
 curl_easy_setopt(cu, CURLOPT_WRITEDATA, fl)

' Scrive il nuovo file immagine .png :
 ris = curl_easy_perform(cu)
 If ris <> 0 Then Error.Raise("Errore nella scrittura del file: " & curl_easy_strerror(ris))

' Va in chiusura e libera tutta la memoria precedentemente allocata:
 fclose(fl)
 Free(url)
 curl_easy_cleanup(cu)

End

Usando le funzioni esterne della libreria libgdk_pixbuf-2.0

In questo caso l'immagine da scaricare deve avere il canale Alfa e dunque deve essere di formato a 32-bit - RGBA.
Per utilizzare alcune funzioni esterne di gdk_pixbuf, si dovrà richiamando nel progetto Gambas la libreria condivisa: "libgdk_pixbuf-2.0.so.0.4200.12 ".

Mostriamo di seguito il codice con un esistente indirizzo web di un'immagine PNG da scaricare (è necessario attivare anche i Componenti "gb.net" e "gb.net.curl").

Private myhttp As New HttpClient As "myhttp"  


Library "libgdk_pixbuf-2.0:0.4200.12"

' 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


Public Sub Button1_Click()
 
' Invia la richiesta al server per scaricare un file immagine:
 myhttp.URL = "https://www.freepnglogos.com/uploads/eye-png/eye-psd-vector-vectorhqm-18.png"
 myhttp.Timeout = 15

' Lasciando il secondo parametro vuoto, i dati dell'immagine vengono salvati soltanto in memoria:
 myhttp.Get()
   
End


Public Sub MyHTTP_Finished()

 Dim s As String

 MyHTTP.Close
 
' Trasferiamo in una variabile stringa i dati dell'immagine scaricata e salvata in memoria:
 s = myhttp.Peek()
 Print "Immagine scaricata !\n\nDimensione: "; Len(s); " byte"
 
 Immagine(s)
  
End


Private Procedure Immagine(im As String)

 Dim bb, bb2 As Byte[]
 Dim w, h As Integer
 Dim loader, pixbuf, dati As Pointer
 Dim c As Byte
 Dim bo As Boolean
 Dim st As Stream
 Dim immago As Image
  
 bb = Byte[].FromString(im)
 
 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"
 c = gdk_pixbuf_get_n_channels(Pixbuf)
 Print "Canali:    "; c
  
' Verifichiamo che l'immagine scaricata abbia il canale Alfa:
 bo = gdk_pixbuf_get_has_alpha(Pixbuf)
 If bo = False Then Error.Raise("L'immagine scaricata è priva del canale Alfa !")
  
 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 * c]
   .Read(st, 0, .count)
 End With
 
' Effettua la correzione della disposizione dei dati RGB dei pixel dell'immagine scaricata:
 bb2 = Corregge(bb)
  
 st.Close
 
' Viene preparata la variabile di tipo Image per la gestione dei dati del futuro nuovo file immagine:
 With immago = New Image(w, h, 0, 0)
   st = Memory .Data For Write
 End With
 
' Scrive i dati presenti nel vettore "bb[]" nell'area di memoria puntata dal Puntatore ".Data" della variabile di tipo "Image":
 bb2.Write(st, 0, bb2.Count)
 
 st.Close
 
 With PictureBox1
   .W = w
   .H = h
   .Image = immago
 End With
 
End


Private Function Corregge(vett As Byte[]) As Byte[]
 
 Dim i As Integer
 Dim bb As Byte[]
 
 bb = New Byte[vett.Count]
  
 For i = 0 To vett.Max Step 4
   bb[i + 1] = vett[i + 1]
   bb[i + 2] = vett[i]
   bb[i] = vett[i + 2]
   bb[i + 3] = vett[i + 3]
 Next
  
 Return bb
  
End

Usando Shell ed il comando wget

Nell'esempio che segue sul Form del programma saranno posti semplicemente una PictureBox ed un Button. Scaricheremo un'immagine da un sito internet mediante wget (che sarà lanciato nel nostro programma mediante il comando Shell), e successivamente la caricheremo nella PictureBox:

Public Sub Button1_Click()

' Scarica l'immagine dal sito web.
' L'informazione sul percorso, ove sarà scaricata l'immagine, non deve contenere il nome finale dell'immagine (solo il percorso della/e cartella/e).
' Inoltre il Processo del comando "wget" lanciato dall'istruzione "Shell" verrà aperto in "Lettura" per ottenere in console i messaggi inviati dal predetto Processo.
 Shell "wget indirizzo/web/della/immagine/da/scaricare --directory-prefix /percorso/ove/l'immagine/sarà/scaricata"  For Input As "Processo" '[nota 4]

End


Public Sub Processo_Read()

 Dim s As String

 Line Input #Last, s

 Print s

End


Note

[1] Vedere anche la seguente pagina: Ottenere un'immagine di una pagina web

[2] In vero, con questa metodo è possibile scaricare qualsiasi tipo di file.

[3] E' possibile ricreare utilmente con questo metodo qualsiasi tipo di file.

[4] Se si vuole inserire l'immagine in una nuova cartella da creare, questa deve essere aggiunta alla fine del pecorso ove si intende scaricare il file:

--directory-prefix /percorso/nuova_cartella


Riferimenti