codice:
//'=======================================================================================
/*--------------------------------------------------------------------------------------
* permette di fondere due immagini
* immagineDaModificare è la bitmap principale su cui si deve disegnare l'altra bitmap
* logo è la bitmpa da disegnare su immagineDaModificare
* x, y: posizione di disegno di logo
* makeTransparent permette di rendere trasparente il logo (toglie il colore di sfondo)
* transparency: 0 = massima trasparenza, 1 = massima opacità di logo
* -1, non viene considerato
---------------------------------------------------------------------------------------*/
public static void ImgMerge(Bitmap immagineDaModificare, Bitmap logo, int x, int y, bool makeTransparent, double transparency)
{
//creo la superficie di disegno in cui lavorerò
Graphics gr = Graphics.FromImage(immagineDaModificare);
//imposto lavoro alta qualità
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
gr.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
//se voglio il logo trasparente
if( makeTransparent )
logo.MakeTransparent();
//----------------------------------------------------
//creo la semitrasparenza solo se il parametro transparency non è negativo
if( Math.Sign(transparency) != -1 )
{
//crea una matrice 5x5 col valore trasparenza nella posizione (4,4)
Single[][] values = {
new Single[] {1, 0, 0, 0, 0},
new Single[] {0, 1, 0, 0, 0},
new Single[] {0, 0, 1, 0, 0},
new Single[] {0, 0, 0, (float)transparency, 0},
new Single[] {0, 0, 0, 0, 1}};
//usa la matrice per inizializzare un oggetto colorMatrix
System.Drawing.Imaging.ColorMatrix colMatrix = new System.Drawing.Imaging.ColorMatrix(values);
//crea un oggetto ImageAttributes ed assegna la matrice colore
System.Drawing.Imaging.ImageAttributes imageAttr = new System.Drawing.Imaging.ImageAttributes();
imageAttr.SetColorMatrix(colMatrix, System.Drawing.Imaging.ColorMatrixFlag.Default, System.Drawing.Imaging.ColorAdjustType.Bitmap);
//disegna la bitmap usando la matrice colore
gr.DrawImage(logo, new Rectangle(x, y, logo.Width, logo.Height), 0, 0, logo.Width, logo.Height, GraphicsUnit.Pixel, imageAttr);
}
else
{
//disegno il logo nella posizione data
gr.DrawImage(logo, x, y);
}
gr.Dispose();
}
//-------------------------------------------------------------------------
//questa procedura, data una immagine bmpSource, la ritaglia secondo il
//rettangolo clip passato
//-------------------------------------------------------------------------
public static void ImgClip(ref Bitmap bmpSource, Rectangle clip)
{
Bitmap bmp = new Bitmap(clip.Width, clip.Height, bmpSource.PixelFormat);
bmp.SetResolution(bmpSource.HorizontalResolution, bmpSource.VerticalResolution);
Graphics gr = Graphics.FromImage(bmp);
gr.Clear(Color.White);
//'imposto lavoro alta qualità
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
gr.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
gr.DrawImage(bmpSource, new Rectangle(0, 0, clip.Width, clip.Height), clip, GraphicsUnit.Pixel);
gr.Dispose();
bmpSource.Dispose();
bmpSource = bmp;
}
public static void ImgClipCenter(ref Bitmap bmp, Rectangle clip, int contenitoreW, int contenitoreH, Color coloreSottofondo)
{
//taglio l'immagine
ImgClip(ref bmp, clip);
//creo il riquadro bianco
Bitmap bmp1 = new Bitmap(contenitoreW, contenitoreH, bmp.PixelFormat);
bmp1.SetResolution(bmp.HorizontalResolution, bmp.VerticalResolution);
Graphics gr = Graphics.FromImage(bmp1);
gr.Clear(coloreSottofondo);
//imposto lavoro alta qualità
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
gr.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
gr.DrawImage(bmp, new Rectangle((int)((contenitoreW - bmp.Width) / 2), (int)((contenitoreH - bmp.Height) / 2), bmp.Width, bmp.Height), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
bmp.Dispose();
gr.Dispose();
bmp = bmp1;
}
public static void ImgClipCenter(ref Bitmap bmp, Rectangle clip, int contenitoreW, int contenitoreH)
{
ImgClipCenter(ref bmp, clip, contenitoreW, contenitoreH, Color.White);
}
//----------------------------------------------------------------
//restituisce una immagine con un bordo di dato spessore e colore
//----------------------------------------------------------------
public static void ImgBorder(ref Bitmap bmp, int bordoPixel, Color coloreSottofondo)
{
int contenitoreW = bmp.Width + bordoPixel + bordoPixel;
int contenitoreH = bmp.Height + bordoPixel + bordoPixel;
Bitmap bmp1 = new Bitmap(contenitoreW, contenitoreH, bmp.PixelFormat);
bmp1.SetResolution(bmp.HorizontalResolution, bmp.VerticalResolution);
Graphics gr = Graphics.FromImage(bmp1);
gr.Clear(coloreSottofondo);
//imposto lavoro alta qualità
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
gr.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
gr.DrawImage(bmp, new Rectangle((int)((contenitoreW - bmp.Width) / 2), (int)((contenitoreH - bmp.Height) / 2), bmp.Width, bmp.Height), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
bmp.Dispose();
gr.Dispose();
bmp = bmp1;
}
public static void ImgBorder(ref Bitmap bmp, int bordoPixel)
{
ImgBorder(ref bmp, bordoPixel, Color.White);
}
/*'------------------------------------------------------------------------------------------------------------------------------------
'dato un contenitore di dimensioni contenitoreW e contenitoreH
'ridimensiona una immagine adattandola dentro il contenitore
'se centrato = true, viene centrata, altrimenti viene disegnata nella posizione 0,0
'l'immagine non viene ingrandita per adattarla
'la parte eccedente viene colorata con coloreSottofondo
'------------------------------------------------------------------------------------------------------------------------------------*/
public static void ImgFit(ref Bitmap bmp, int contenitoreW, int contenitoreH, Color coloreSottofondo, Boolean centrato)
{
int maxW = contenitoreW;
int maxH = contenitoreH;
int oldW = bmp.Width;
int oldH = bmp.Height;
double fattoreW = (double)(maxW) / (double)(oldW);
double fattoreH = (double)(maxH) / (double)(oldH);
int newW = 0, newH = 0;
if (fattoreW >= fattoreH)
{
newW = Convert.ToInt32(oldW * fattoreH);
newH = Convert.ToInt32(oldH * fattoreH);
}
else
{
newW = Convert.ToInt32(oldW * fattoreW);
newH = Convert.ToInt32(oldH * fattoreW);
}
ImgResize(ref bmp, newW, newH, System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic, false);
//'creo il riquadro
Bitmap bmp1 = new Bitmap(contenitoreW, contenitoreH, bmp.PixelFormat);
bmp1.SetResolution(bmp.HorizontalResolution, bmp.VerticalResolution);
Graphics gr = Graphics.FromImage(bmp1);
gr.Clear(coloreSottofondo);
//'imposto lavoro alta qualità
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
gr.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
if(centrato)
gr.DrawImage(bmp, new Rectangle((int)((contenitoreW - bmp.Width) / 2), (int)((contenitoreH - bmp.Height) / 2), bmp.Width, bmp.Height), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
else
gr.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
bmp.Dispose();
gr.Dispose();
bmp = bmp1;
}
/*'------------------------------------------------------------------------------------------------------------------------------------
'dato un contenitore di dimensioni contenitoreW e contenitoreH
'ridimensiona una immagine centrandola dentro il contenitore
'l'immagine non viene ingrandita per adattarla
'la parte eccedente viene colorata con coloreSottofondo
'------------------------------------------------------------------------------------------------------------------------------------*/
public static void ImgFit(ref Bitmap bmp, int contenitoreW, int contenitoreH, Color coloreSottofondo)
{
ImgFit(ref bmp, contenitoreW, contenitoreH, coloreSottofondo, true);
}
public static void ImgFit(ref Bitmap bmp, int contenitoreW, int contenitoreH)
{
ImgFit(ref bmp, contenitoreW, contenitoreH, Color.White, true);
}