Differenze tra le versioni di "Scaricare una immagine da un sito internet"
Riga 5: | Riga 5: | ||
===Con il Metodo ''statico'' ".Download()"=== | ===Con il Metodo ''statico'' ".Download()"=== | ||
− | + | Public Sub Form_Open() | |
Dim tp As New HttpClient | Dim tp As New HttpClient | ||
Dim s As String | Dim s As String | ||
Dim im As New Image | Dim im As New Image | ||
− | + | ||
− | + | s = tp.Download("<font color=gray>''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": | 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")) | File.save("/tmp/prova.png", HttpClient.Download("https://www.gambas-it.org/wiki/resources/assets/gambas-wiki-logo.png")) | ||
− | + | End | |
===Con il Metodo ".Get()"=== | ===Con il Metodo ".Get()"=== | ||
− | Private ht As New HttpClient As " | + | Private ht As New HttpClient As "HttpClient1" |
− | + | ||
− | + | Public Sub Button1_Click() | |
With ht | With ht | ||
Riga 38: | Riga 38: | ||
.Get(Null, "<font color=gray>''/percorso/del/file/immagine/scaricato''</font>") | .Get(Null, "<font color=gray>''/percorso/del/file/immagine/scaricato''</font>") | ||
End With | End With | ||
− | + | ||
− | + | End | |
− | + | ||
− | + | ||
+ | Public Sub HttpClient1_Finished() | ||
ht.Close | ht.Close | ||
Riga 48: | Riga 49: | ||
PictureBox1.Picture = Picture["<font color=gray>''/percorso/del/file/immagine/scaricato_e_ricreato''</font>"] | PictureBox1.Picture = Picture["<font color=gray>''/percorso/del/file/immagine/scaricato_e_ricreato''</font>"] | ||
− | + | End | |
oppure anche utilizzando l'Evento "_Read()": | oppure anche utilizzando l'Evento "_Read()": | ||
− | Private ht As New HttpClient As " | + | Private ht As New HttpClient As "HttpClient1" |
Private stringa As String | Private stringa As String | ||
− | + | Public Sub Button1_Click() | |
With ht | With ht | ||
Riga 65: | Riga 66: | ||
<b>End</b> | <b>End</b> | ||
− | <b>Public</b> Sub | + | <b>Public</b> Sub HttpClient1_Read() |
Dim sBuf As String | Dim sBuf As String | ||
Riga 77: | Riga 78: | ||
<b>End</b> | <b>End</b> | ||
− | <b>Public</b> Sub | + | <b>Public</b> Sub HttpClient1_Finished() |
Label1.Text = ("Immagine scaricata !") | Label1.Text = ("Immagine scaricata !") | ||
Riga 94: | Riga 95: | ||
' '''PictureBox1.Image = im.FromString(stringa)'''</font> | ' '''PictureBox1.Image = im.FromString(stringa)'''</font> | ||
− | + | End | |
Riga 101: | Riga 102: | ||
Si potrà effettuare il collegamento ad un file immagine richiamandolo mediante la Proprietà ".HTML" del Controllo ''WebView''. | Si potrà effettuare il collegamento ad un file immagine richiamandolo mediante la Proprietà ".HTML" del Controllo ''WebView''. | ||
<BR>In tal caso è necessario attivare anche il Componente ''gb.gui.qt.webkit'' oppure il Componente ''gb.qt5.webkit'': | <BR>In tal caso è necessario attivare anche il Componente ''gb.gui.qt.webkit'' oppure il Componente ''gb.qt5.webkit'': | ||
− | + | Public Sub Form_Open() | |
WebView1.HTML = "<IMG SRC=https://www.gambas-it.org/wiki/resources/assets/gambas-wiki-logo.png>" | WebView1.HTML = "<IMG SRC=https://www.gambas-it.org/wiki/resources/assets/gambas-wiki-logo.png>" | ||
− | + | End | |
− | + | ||
+ | Public Sub WebView1_Load() | ||
Dim im As New Image(<FONT Color=gray>''larghezza_dell'immagine''</font>, <FONT Color=gray>''altezza_dell'immagine''</font>, Color.White, Image.Standard) | Dim im As New Image(<FONT Color=gray>''larghezza_dell'immagine''</font>, <FONT Color=gray>''altezza_dell'immagine''</font>, Color.White, Image.Standard) | ||
Riga 122: | Riga 124: | ||
im.Save("/tmp/gambas-wiki-logo.png", 100) | im.Save("/tmp/gambas-wiki-logo.png", 100) | ||
− | + | End | |
===Cercare nel codice HTML di una pagina web l'indirizzo di un file immagine per poi scaricarlo=== | ===Cercare nel codice HTML di una pagina web l'indirizzo di un file immagine per poi scaricarlo=== | ||
Riga 134: | Riga 136: | ||
− | + | Public Sub Button1_Click() | |
With WebView1 = New WebView(Me) As "WebView1" | With WebView1 = New WebView(Me) As "WebView1" | ||
Riga 140: | Riga 142: | ||
End With | End With | ||
− | + | End | |
− | + | ||
+ | Public Sub WebView1_Load() | ||
Dim percorso As String | Dim percorso As String | ||
Riga 158: | Riga 161: | ||
End With | End With | ||
− | + | End | |
+ | |||
− | + | Public Sub Miohttp_Finished() | |
miohttp.Close | miohttp.Close | ||
− | + | End | |
===Usando l'Evento "_Download()" del Controllo ''WebView'' e la Classe ''Clipboard''=== | ===Usando l'Evento "_Download()" del Controllo ''WebView'' e la Classe ''Clipboard''=== | ||
+ | L'Evento "_Download()" del Controllo ''WebView'' può considerarsi obsoleto, giacché era funzionale alla vecchia versione del ''WebView''. | ||
+ | <BR>Ad ogni modo può attuamente ritornare utile, poiché questo Evento viene sollevato, quando - dopo aver fatto apparire la piccola fienstra del menù contestuale cliccando con il tasto destro sul ''WebView'' - si sceglie la voce "Save Image". | ||
+ | <BR>Più in particolare il Controllo ''WebView'' è dotato, come già detto, di un menu contestuale che consente, tra le altre cose, di effettuare il download di un'immagine presente nella pagina web attiva. La scelta dell'opzione "Save image" innesca l'Evento "_Download()" della Classe ''WebView'', all'interno del quale è possibile mediante l'impostazione del Metodo ".SaveFile()" della Classe ''Dialog'' assegnare il percorso di destinazione e il nome dell'immagine da salvare. | ||
+ | |||
+ | La procedura per salvare una immagine prescelta, presente in una pagina web mostrata sul ''WebView'', è la seguente: | ||
+ | <BR>1) cliccare con il tasto destro del mouse sull'immagine da salvare; | ||
+ | <BR>2) nella finestra del menu contestuale, che si apre, scegliere l'opzione "Copy Image"; | ||
+ | <BR>3) riaprire nuovamente la finestra del menu contestuale del Controllo ''WebView'' (vedi precedente punto 1); | ||
+ | <BR>4) scegliere ora l'opzione "Save Image"; | ||
+ | <BR>5) nella consueta finestra di dialogo, che si apre, impostare il percorso il nome e il tipo di file immagine da salvare. | ||
+ | |||
+ | Mostriamo un esempio pratico: | ||
Public Sub Form_Open() | Public Sub Form_Open() | ||
Riga 192: | Riga 208: | ||
===Uso del Metodo "Desktop.Open()"=== | ===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: | 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("<FONT Color=gray>''indirizzo/web/del/file/immagine/da/scaricare''</font>") | Desktop.Open("<FONT Color=gray>''indirizzo/web/del/file/immagine/da/scaricare''</font>") | ||
− | + | End | |
===Usando la Classe "URLLabel"=== | ===Usando la Classe "URLLabel"=== | ||
Effetto simile a quello precedente si ottiene usando un Oggetto della Classe "URLLabel". | Effetto simile a quello precedente si ottiene usando un Oggetto della Classe "URLLabel". | ||
<BR>E' necessario attivare anche il Componente ''gb.desktop''. | <BR>E' necessario attivare anche il Componente ''gb.desktop''. | ||
− | + | Public Sub Form_Open() | |
With URLLabel1 | With URLLabel1 | ||
Riga 209: | Riga 225: | ||
End With | End With | ||
− | + | End | |
Riga 256: | Riga 272: | ||
− | + | Public Sub Main() | |
Dim url, cu, fl As Pointer | Dim url, cu, fl As Pointer | ||
Riga 290: | Riga 306: | ||
curl_easy_cleanup(cu) | curl_easy_cleanup(cu) | ||
− | + | End | |
==Usando le funzioni esterne della libreria ''libgdk_pixbuf-2.0''== | ==Usando le funzioni esterne della libreria ''libgdk_pixbuf-2.0''== | ||
Riga 339: | Riga 355: | ||
− | + | Public Sub Button1_Click() | |
<FONT Color=gray>' ''Invia la richiesta al server per scaricare un file immagine:''</font> | <FONT Color=gray>' ''Invia la richiesta al server per scaricare un file immagine:''</font> | ||
− | + | myhttp.URL = "https://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> | <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 | Dim s As String | ||
Riga 362: | Riga 379: | ||
Immagine(s) | Immagine(s) | ||
− | + | End | |
+ | |||
+ | |||
+ | Private Procedure Immagine(im As String) | ||
− | |||
− | |||
Dim bb, bb2 As Byte[] | Dim bb, bb2 As Byte[] | ||
Dim w, h As Integer | Dim w, h As Integer | ||
Riga 428: | Riga 446: | ||
End With | End With | ||
− | + | End | |
− | + | ||
+ | Private Function Corregge(vett As Byte[]) As Byte[] | ||
Dim i As Integer | Dim i As Integer | ||
Riga 446: | Riga 465: | ||
Return bb | Return bb | ||
− | + | End | |
==Usando Shell ed il comando ''wget''== | ==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>: | 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>: | ||
− | + | Public Sub Button1_Click() | |
<font color=gray>' ''Scarica l'immagine dal sito web.'' | <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).'' | ' ''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> | ' ''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 < | + | 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>[[[#Note|nota 4]]]</sup> |
− | + | End | |
− | + | ||
+ | Public Sub Processo_Read() | ||
Dim s As String | Dim s As String | ||
Riga 467: | Riga 487: | ||
Print s | Print s | ||
− | + | End | |
=Note= | =Note= | ||
− | [1] Vedere anche la seguente pagina: [[ | + | [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. | [2] In vero, con questa metodo è possibile scaricare qualsiasi tipo di file. |
Versione delle 08:42, 11 nov 2023
Vedremo di seguito alcune modalità per scaricare dal WEB i dati di file immagini, di cui si conoscono gli indirizzi web. [nota 1]
Indice
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
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 = 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
Usando la proprietà ".HTML"
Si potrà effettuare il collegamento ad un file immagine richiamandolo mediante la Proprietà ".HTML" del Controllo WebView.
In tal caso è necessario attivare anche il Componente gb.gui.qt.webkit oppure il Componente gb.qt5.webkit:
Public Sub Form_Open() WebView1.HTML = "<IMG SRC=https://www.gambas-it.org/wiki/resources/assets/gambas-wiki-logo.png>" End Public Sub WebView1_Load() Dim im As New Image(larghezza_dell'immagine, altezza_dell'immagine, Color.White, Image.Standard) With Paint .Begin(im) WebView1.Document.Paint .End End With ' Appena mostrata nel "WebView", l'immagine sarà mostrata anche in una "PictureBox" e poi salvata come file immagine: PictureBox1.Image = im im.Save("/tmp/gambas-wiki-logo.png", 100) End
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 la Proprietà ".HTML" 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_Load() Dim percorso As String ' Individua l'indirizzo web dell'immagine, tenendo conto del suo nome conosciuto: percorso = Scan(WebView1.HTML, "*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
Usando l'Evento "_Download()" del Controllo WebView e la Classe Clipboard
L'Evento "_Download()" del Controllo WebView può considerarsi obsoleto, giacché era funzionale alla vecchia versione del WebView.
Ad ogni modo può attuamente ritornare utile, poiché questo Evento viene sollevato, quando - dopo aver fatto apparire la piccola fienstra del menù contestuale cliccando con il tasto destro sul WebView - si sceglie la voce "Save Image".
Più in particolare il Controllo WebView è dotato, come già detto, di un menu contestuale che consente, tra le altre cose, di effettuare il download di un'immagine presente nella pagina web attiva. La scelta dell'opzione "Save image" innesca l'Evento "_Download()" della Classe WebView, all'interno del quale è possibile mediante l'impostazione del Metodo ".SaveFile()" della Classe Dialog assegnare il percorso di destinazione e il nome dell'immagine da salvare.
La procedura per salvare una immagine prescelta, presente in una pagina web mostrata sul WebView, è la seguente:
1) cliccare con il tasto destro del mouse sull'immagine da salvare;
2) nella finestra del menu contestuale, che si apre, scegliere l'opzione "Copy Image";
3) riaprire nuovamente la finestra del menu contestuale del Controllo WebView (vedi precedente punto 1);
4) scegliere ora l'opzione "Save Image";
5) nella consueta finestra di dialogo, che si apre, impostare il percorso il nome e il tipo di file immagine da salvare.
Mostriamo un esempio pratico:
Public Sub Form_Open() WebView1.Url = "https://www.enciclopedino.it/Gatto.asp?Razza=Felini" End Public Sub WebView1_Download(Download As WebDownload) If Dialog.SaveFile() Then Return ' Assegna ad una variabile di tipo "Image" la copia dell'immagine presente negli appunti di sistema: Dim im As Image = Clipboard.Paste() ' L'immagine viene salvata nel percorso, con il nome e il tipo di file immagine prescelti nella finestra di dialogo: im.Save(Dialog.Path, 100) 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.7.0 ".
Mostriamo un esempio pratico, nel quale immaginiamo di dover scaricare un file immagine di formato .png:
Library "libcurl:4.7.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.8 ".
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.8" ' 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