stampa questo articolo
Visto il discreto successo di utenti flickr in relazione al tool classifica flickr, mi sono cimentato in una nuova funzionalità… il badge creator!

Cosa è il badge creator?

E’ una semplice (non molto) applicazione fatta in ASP.NET 2.0 che consente, dato un group_id flickr, di generare un badge ossia una immagine contenente le cinque immagini migliori nel mese corrente per il gruppo flickr in questione.

Ad esempio per il gruppo che io e Mago gestiamo (l’ho reso amministratore….hihihihi) nikon d40x italia il badge è il seguente:

Month’s top five in real time – group nikon d40x italy

rank - Classifica Flickr, da oggi disponibile anche il badge creator

Chi utilizza frequentemente Flickr saprà che di badge di questo tipo ce ne sono moltissimi e mostrano tutti informazioni in real-time sul gruppo, ad esempio interessanti ed usatissimi sono i badge di flickriver e bighugelabs.


Vediamo qualche riga di codice dell’applicazione .NET

In primis, per lavorare con le immagini, è necessario utilizzare i seguenti namespace:

using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

L’idea è la seguente, invocare la flickr API per ottenere la classifica delle immagini sotto forma di stream, caricare tale stream in oggetti di tipo Bitmap, copiare ed incollare tale oggetti in modo tale da ottenere una immagine definitiva come quella mostrata sopra.

La parte a mio avviso più interessante è quella relativa al load delle immagini, ho utilizzato il seguente metodo:

public Bitmap LoadPicture(string urlImage)
{
HttpWebRequest wreq;
HttpWebResponse wresp = null;

// Definizione dello stream per carpire l’immagine
System.IO.Stream streamImage = null;

// definizione di un bitmap che costituisce il valore di ritorno
Bitmap bmpImage = null;
// contatto con il web
wreq = (HttpWebRequest)WebRequest.Create(urlImage);
// impostiamo la proprietà necessaria per la creazione dello stream
wreq.AllowWriteStreamBuffering = true;
// richiesta dell’immagine
wresp = (HttpWebResponse)wreq.GetResponse();

// in caso di risposta positiva
if ((streamImage = wresp.GetResponseStream()) != null)
bmpImage = (Bitmap)System.Drawing.Image.FromStream(streamImage);
if (streamImage != null)
streamImage.Close();
if (wresp != null)
wresp.Close();
return (bmpImage);
}

In definitiva dato un URL di una immagine Flickr (che si ottiene invocando le API) la prima cosa da fare è convertire tale stream in oggetto Bitmap.

Una volta effettuata tale conversione, per creare l’immagine di cui sopra è necessario fare le seguenti operazioni:

caricare la bitmap in un oggetto di tipo Image:

System.Drawing.Image oImg = (System.Drawing.Image)LoadPicture(urlPhoto);

Aver preventivamente definito un oggetto di tipo Bitmap che rappresenta la nostra Bitmap di lavoro e un oggetto di tipo Graphics con il quale effettuare i vari copia, incolla etc…:

Bitmap oBmp = new Bitmap(400, 140, PixelFormat.Format24bppRgb);
Graphics oGrp = Graphics.FromImage(oBmp);

Effettuare operazioni di pulizia e riempimento dell’immagine:

oGrp.SmoothingMode = SmoothingMode.AntiAlias;
oGrp.TextRenderingHint = TextRenderingHint.AntiAlias;
SolidBrush oBrush = new SolidBrush(Color.White);
oGrp.FillRectangle(oBrush, 0, 0, 400, 140);

oGrp.Clear(Color.White);

Disegnare l’immagine ottenuta dal Web:

oGrp.DrawImage(oImg, 10, 30, 75, 75);

Scrivere del testo:

PointF oPoint1 = new PointF(10, 105);
oGrp.DrawString(“#1”, oFont, oBrushText, oPoint1);

Ed infine salvare l’immagine in formato .Bmp

oBmp.Save(Server.MapPath(@”..\public\flickr\badge\” + group_id + “.bmp”), System.Drawing.Imaging.ImageFormat.Bmp);

Questa parte mi ha fatto penare molto in quanto avrei voluto utilizzare il seguente metodo:

Response.ContentType = “image/jpeg”;
oBmp.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);

Con il quale si ottiene direttamente una immagine come Output dello stream ma la qualità, rispetto al salvarla in Bmp su disco, era decisamente inferiore.

Potrebbe interessarti anche ...

4 Commenti

LASCIA UN COMMENTO

Please enter your comment!
Please enter your name here