Resize di immagini e diminuzione dell'alpha
Data: 5/29/2005
Categoria: C#
Codice d'esempio


Oggi vedremo come utilizzare le classi del namespace System.Drawing, per creare due semplici metodi che si possono rivelare molto utili; il primo fa un resize dell'immagine data una certa larghezza, mentre il secondo ne diminuisce l'alpha, in modo da darle un effetto di trasparenza.
Il resize dell'immagine può essere fatto anche utilizzando il metodo GetThumbnailImage della classe Bitmap, metodo molto utile per creare immagini Thumbnail in modo dinamico, ma che però vuole come parametri sia la larghezza che l'altezza della nuova immagine, togliendo così la possibilità di mantenerne le dimensioni in percentuale; per questo mi è sembrato utile fare un metodo ad hoc che lo permetta.
Il codice non fa altro che calcolare l'altezza della nuova immagine in percentuale, percentuale che viene precedentemente calcolata in base alla larghezza del'immagine di partenza e quella decisa dall'utente, ed infine, creare la nuova immagine ridimensionata tramite l'uso dei metodi della classe Graphics, classe che incapsula una superficie di disegno GDI+.

public static Bitmap Resize(Bitmap b, int x)

{
try
{
int width = x;
int height = 0;
//Calcolo la percentuale di ridimensionamento double percentage = (x * 100);
percentage = percentage / b.Width;
percentage = percentage / 100;
//Calcolo la nuova altezza in base alla percentuale di resize height = Convert.ToInt32(b.Height * percentage);
//Creo la nuova Immagine Bitmap result = new Bitmap(width, height);
Graphics g = Graphics.FromImage(result);
g.DrawImage(b, new Rectangle(0, 0, width, height),
0, 0, b.Width, b.Height, GraphicsUnit.Pixel);

return result;
}
catch(Exception exe)
{
Console.WriteLine(exe.Message);
return null;
}
}
Vediamo ora, invece, come modificare l'alpha di un immagine, in modo tale da renderla trasparente; anche in questo caso ci avvaliamo dell'uso dei metodi della classe Graphics per ridisegnare l'immagine, e delle classi ColorMatrix e ImageAttributes rispettivamente per applicare una matrice 3x3 contenente le coordinate dello spazio RGB modificate secondo il nostro nuovo parametro per l'alpha e per applicare questa matrice all'immagine.

public static Bitmap EditAlpha(Bitmap b, float alpha)

{
try
{
//Creo la nuova immagine vuota Bitmap result = new Bitmap(b.Width, b.Height);
//Creo la superficie di disegno GDI+ Graphics g = Graphics.FromImage(result);
//Setto lo sfondo bianco e la matrice 3x3 con le coordinate //dello spazio RGB modificate secondo il parametro dell'alpha g.Clear(Color.White);
ColorMatrix cm = new ColorMatrix();
cm.Matrix33 = alpha;
//Applico la matrice ImageAttributes ia = new ImageAttributes();
ia.SetColorMatrix(cm);
//Ridisegno l'immagine modificata g.DrawImage(b, new Rectangle(0, 0, b.Width, b.Height),
0, 0, b.Width, b.Height, GraphicsUnit.Pixel, ia);

return result;
}
catch(Exception exe)
{
Console.WriteLine(exe.Message);
return null;
}
}
I due metodi descritti, possono essere utilizzati, in una console application, in questo modo:

[STAThread]

static void Main(string[] args)
{
if(args.Length != 0 && args[0] != null)
{
Bitmap oldImg = new Bitmap(args[0]);
//Ridimensiono l'immagine ad una larghezza di 50 pixel Bitmap newImg = Resize(oldImg, 50);
newImg.Save("resize_" + args[0]);

newImg = null;
//Diminuisco l'alpha del 70% newImg = EditAlpha(oldImg, 0.3f);
newImg.Save("alpha_" + args[0]);
}
}
Producendo questo risultato:

Immagine di partenza Resize dell'immagine Modifica alpha
Immagine di partenza Resize dell'immagine Modifica alpha