3° pezzo
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);
        }