C# download immagine di sfondo di bing tramite .Net 9

Articolo che illustra una tecnica per scaricare l'immagine giornaliera del motore di ricerca Bing ed impostarla come sfondo del proprio desktop.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

In questo articolo vedremo come effettuare il download dell’immagine giornaliera del motore di ricerca Bing, tramite il linguaggio di programmazione C#, in un progetto di tipo “Windows Application”.
Il motore di ricerca Bing , qui https://www.bing.com/?cc=it   il sito, ogni giorno viene visualizzata una nuova immagine. Immagini molto belle riguardante luoghi delle varie città del mondo, o altro tema come lo spazio.
L’articolo vuole fornire la possibilità di effettuare il download dell’immagine ed eventualmente impostarla come sfondo del Desktop per il sistema operativo Windows 11.

Creazione del progetto


Si crea un nuovo progetto di tipo “Windows Application”, selezionando come modello quello denominato “App Windows Forms”, e l’ultima versione del Framework, nel momento in cui stiamo scrivendo è la 9.
Inseriamo nella form, un controllo di tipo “Label”, con la proprietà “Text”, impostata con il valore “Percorso salvataggio immagine” , un controllo di tipo “Casella di testo”, con la proprietà “Name” impostato con il valore “TxtPercorso” , la proprietà “Enable” impostato a “false” e la proprietà “BackColor” impostato con il valore “Control”.
Inseriamo due controlli di tipo “Pulsanti”, il primo che si troverà al lato della casella di testo, avrà la proprietà “Text” impostato con il valore “…” e la proprietà “Name” impostato con il valore “BtnImpostaPercorso”. Il secondo pulsante, situato di lato al precedente, avrà impostata la proprietà “Text” con il valore “Scarica”, e la proprietà “Name”, con il valore “BtnDownloadImmagineBing”, la forma sarà come quella mostrata in figura 1.

Figura 1 – La form con i vari controlli

Figura 1 – La form con i vari controlli

 

Stesura del codice


Terminata la creazione della nostra form, non resta che scrivere il codice per la realizzazione della nostra applicazione.
Facciamo doppio click sul pulsante che abbiamo chiamato “BtnImpostaPercorso”, in questo modo passiamo in visualizzazione codice nell’evento click del pulsante.
In questo evento tramite la classe “FolderBrowserDialog”, visualizziamo una finestra per la selezione del percorso dove andremo a salvare l’immagine, e visualizziamo il percorso nella casella di testo.
Di seguito si riporta il frammento di codice delle suddette operazioni.

C#
private void BtnImpostaPercorso_Click(object sender, EventArgs e)
{
   try
   {
       //Apro la finestra di dialogo per la selezione della cartella
       using (FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog())
       {
           folderBrowserDialog.Description = "Seleziona la cartella di destinazione per salvare l'immagine di bing";
           if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
           {
               // Imposto il percorso selezionato nella casella di testo
               TxtPercorso.Text = folderBrowserDialog.SelectedPath;
           }
       }
   }
   catch (Exception ex)
   {
       MessageBox.Show("Errore: " + ex.Message);
   }
}

Rimanendo sempre in visualizzazione codice, in alto, sopra ad ogni dichiarazione, inseriamo lo spazio dei nomi per la gestione del formato “Json” e delle chiamate asincrone
Di seguito si riporta il namespace per utilizzare le classi “Json”.

C#
using System.Text.Json;
using System.Threading.Tasks;

Passiamo in visualizzazione grafica, e facciamo doppio click sul pulsante con la scritta “Scarica”, in questo modo passiamo in visualizzazione codice dell’evento click del pulsante stesso.
In questo evento, scriviamo il codice per richiamare la funzione per il download dell’immagine.

Di seguito si riporta il codice dell’evento click del pulsante per scaricare l’immagine.

C#
private void BtnDownloadImmagineBing_Click(object sender, EventArgs e)
{
   try
   {
       if (TxtPercorso.Text.Trim() == "")
       {
           MessageBox.Show("Impostare un percorso dove salvare l'immagine.");
           return;
       }
       _ = DownloadImmagine(TxtPercorso.Text);
   }
   catch (Exception ex)
   {
       MessageBox.Show("Errore: " + ex.Message);
   }
}

La funzione per il download, che accetta un parametro riguardante il percorso dove salvare l’immagine, tramite la classe “HttpClient”, effettua due operazioni, la prima per rilevare il codice HTML e la seconda per effettuare il download dell’immagine restituendo un array di byte. 
Di seguito si riporta il frammento di codice della funzione per il download dell’immagine. 

C#
static async Task DownloadImmagine(string percorsoSalvataggio)
{
   //Percorso di Bing dove estrapolare l'immagine
   string bingApiUrl = "https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=it-IT";
   //Richiesta http 
   using HttpClient client = new HttpClient();
   try
   {
       //Rilevo codice html per la gestione JSON
       string json = await client.GetStringAsync(bingApiUrl);
       //Estraggo il nome dell'immagine ed il percorso dell'immagine bing
       using JsonDocument doc = JsonDocument.Parse(json);
    //GET Property e get string vanno tutto attaccato
       string urlBase = doc.RootElement
           .Get 
Property   
 ("images")[0]
           .Get 
Property      
("urlbase")
           .Get 
String();  
       //Nome del file da salvare
       string nomeFile =  urlBase?.Split(".").Length > 1 ? urlBase.Split(".")[1] : urlBase;
       //rileva il sito preciso con l'immagine
       string imageUrl = $"https://www.bing.com{urlBase}_1920x1080.webp";
       nomeFile = percorsoSalvataggio + "\\" + nomeFile + ".webp";
       //Scarico l'immagine in array di byte
       byte[] imageBytes = await client.GetByteArrayAsync(imageUrl);
       await File.WriteAllBytesAsync(nomeFile, imageBytes);
       MessageBox.Show("File salvato con successo.");
   }
   catch (Exception ex)
   {
       MessageBox.Show("Errore: " + ex.Message);
   }
}

Impostare lo sfondo di Windows

Nel caso che invece abbiamo intenzione di impostare lo sfondo di Windows, quello che si vede nel desktop, tramite l’API di Windows, e precisamente “SystemParametersInfo”, possiamo cambiare lo sfondo con l’immagine appena scarica.
Per utilizzare le API di Windows, dobbiamo aggiungere lo spazio dei nomi per l’interoperabilità.
Di seguito si riporta tale dichiarazione.

C#
using System.Runtime.InteropServices;
 

In alto, dopo il costruttore della form inseriamo la dichiarazione della funzione delle API per cambiare l'immagine dello sfondo del desktop. Di seguito si riporta il frammento di codice di tale dichiarazione.

C#
[DllImport("user32.dll", SetLastError = true)]
private static extern bool SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
private const int SPI_SETDESKWALLPAPER = 20;
private const int SPIF_UPDATEINIFILE = 0x01;
private const int SPIF_SENDWININICHANGE = 0x02;
 

La funzione download verrà modifica aggiungendo dopo il salvataggio dell’immagine, la chiamata alla funzione, passando il percorso e nome del file che abbiamo scaricato. 

Di seguito la modifica da inserire dopo il salvataggio del file.

C#
 bool result = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, nomeFile, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);

Si riporta qui di seguito la funzione completa del download dell'immagine di Bing, impostandola come sfondo del desktop.

C#
static async Task DownloadImmagine(string percorsoSalvataggio)
{
   //Percorso di Bing dove estrapolare l'immagine
   string bingApiUrl = "https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=it-IT";
   //Richiesta http 
   using HttpClient client = new HttpClient();
   try
   {
       //Rilevo codice html per la gestione JSON
       string json = await client.GetStringAsync(bingApiUrl);
       //Estraggo il nome dell'immagine ed il percorso dell'immagine bing
       using JsonDocument doc = JsonDocument.Parse(json);
    //GET Property e get string vanno tutto attaccato
       string urlBase = doc.RootElement
           .Get 
Property   
 ("images")[0]
           .Get 
Property      
("urlbase")
           .Get 
String();  
       //Nome del file da salvare
       string nomeFile =  urlBase?.Split(".").Length > 1 ? urlBase.Split(".")[1] : urlBase;
       //rileva il sito preciso con l'immagine
       string imageUrl = $"https://www.bing.com{urlBase}_1920x1080.webp";
       nomeFile = percorsoSalvataggio + "\\" + nomeFile + ".webp";
       //Scarico l'immagine in array di byte
       byte[] imageBytes = await client.GetByteArrayAsync(imageUrl);
       await File.WriteAllBytesAsync(nomeFile, imageBytes);
       bool result = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, nomeFile, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
         if (!result)
         {
             throw new Exception("Impossibile impostare l'immagine come sfondo del desktop.");
         }
         MessageBox.Show("File salvato con successo ed impostato l'immagine di sfondo.");

   }
   catch (Exception ex)
   {
       MessageBox.Show("Errore: " + ex.Message);
   }
}

Si fa presente che non tutte le versioni di Windows accettano file di tipo “wepb” o “Jpg”, nelle versioni precedenti di Windows 11, la modifica dell'immagine dello sfondo del Desktop potrebbero avere problemi, in tal caso occorre cambiare il formato di tipo ".BMP".

Conclusioni


L’articolo ha voluto fornire al lettore, la possibilità di scaricare le immagini giornalieri del motore di ricerca Bing, aggiungendoli eventualmente come sfondo per il proprio desktop di Windows 11. I vari esempi di codice sono alla base per la realizzazione di un programma, che permette di gestire le immagini giornalieri e decidere di volta in volta quali impostarli come sfondo.