5° ultimo pezzo
codice:
        
        
        
        
        

        
        /*--------------------------------------------------------------------------------
         * ruota l'immagine, da 0 a 360 gradi. Per avere lo sfondo trasparente, l'immagine
         * deve essere png ed il colore transparent
         * ------------------------------------------------------------------------------*/
        public static void ImgRotate(ref Bitmap bmp, double angolo, Color coloreSottofondo)
        {
            //converto l'angolo in gradi
            double gradi = 0;
            if( angolo < 0 )
                angolo = 360 - Math.Abs(angolo);
            if(angolo >= 0 && angolo <= 90)
                gradi = angolo;
            else if(angolo >= 90 && angolo <= 180)
                gradi = 180 - angolo;
            else if(angolo >= 180 && angolo <= 270)
                    gradi = angolo - 180;
            else if(angolo >= 270 && angolo <= 360)
                gradi = 360 - angolo;
            else if(angolo >= -90 && angolo <= 0)
                gradi = -angolo;

            double rotazione = (gradi * Math.PI / 180d);

            double h = 0, w = 0;
            h = bmp.Height;
            w = bmp.Width;

            int h1 = 0, w1 = 0;
            h1 = (int)(Math.Round(Math.Abs(h * Math.Cos(rotazione)) + Math.Abs(w * Math.Sin(rotazione))));
            w1 = (int)(Math.Round(Math.Abs(h * Math.Sin(rotazione)) + Math.Abs(w * Math.Cos(rotazione))));

            float x0 = 0, y0 = 0, x1 = 0, y1 = 0, x2 = 0, y2 = 0;

            if(angolo >= 0 && angolo <= 90)
            {
                x0 = 0;
                y0 = (float)(Math.Abs(w * Math.Sin(rotazione)));
            
                //trovo le posizioni di (x1,y1) e (x2,y2)
                x1 = Convert.ToSingle(w * Math.Cos(rotazione));
                y1 = Convert.ToSingle(0);
                x2 = Convert.ToSingle(h * Math.Sin(rotazione));
                y2 = Convert.ToSingle(h1);
            }

            else if(angolo >= 90 && angolo <= 180)
            {
                x0 = (float)(w * Math.Cos(rotazione));
                y0 = h1;

                x1 = 0;
                y1 = (float)(h * Math.Cos(rotazione));
                x2 = w1;
                y2 = (float)(w * Math.Sin(rotazione));
            }

            else if(angolo >= 180 && angolo <= 270)
            {
                x0 = w1;
                y0 = (float)(h * Math.Cos(rotazione));

                x1 = (float)(h * Math.Sin(rotazione));
                y1 = h1;
                x2 = (float)(w * Math.Cos(rotazione));
                y2 = 0;
            }

            else if(angolo >= 270 && angolo <= 360)
            {
                x0 = (float)(h * Math.Sin(rotazione));
                y0 = 0;

                x1 = w1;
                y1 = (float)(w * Math.Sin(rotazione));
                x2 = 0;
                y2 = (float)(h * Math.Cos(rotazione));

            }


            Bitmap bmp1 = null;
            bmp1 = new Bitmap(w1, h1);

            Graphics gr1 = Graphics.FromImage(bmp1);
            gr1.Clear(coloreSottofondo);

            //imposto lavoro alta qualità
            gr1.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            gr1.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            gr1.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
            gr1.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;

            //creo la matrice di punti
            PointF[] points = {new PointF(x0, y0), new PointF(x1, y1), new PointF(x2, y2)};

            //disegno l'immagine ruotata
            gr1.DrawImage(bmp, points);

            gr1.Dispose();
            bmp.Dispose();

            bmp = bmp1;

        }


        //'-----------------------------------------------------------------------------------------
        //'serve per produrre un gif con trasparenza
        //'-----------------------------------------------------------------------------------------
        public static MemoryStream MakeTransparentGIF(MemoryStream originalBitMapMemoryStream, Color transparentColor)
        {
            int transparentArgb = transparentColor.ToArgb();

            using (Bitmap originalBitmap = new Bitmap(originalBitMapMemoryStream))
            {
                using (Bitmap newBitmap = new Bitmap(originalBitmap.Width, originalBitmap.Height, originalBitmap.PixelFormat))
                {
                    System.Drawing.Imaging.ColorPalette originalPalette = originalBitmap.Palette;
                    System.Drawing.Imaging.ColorPalette newPalette = newBitmap.Palette;

                    int index = 0;
                    int transparentIndex = -1;

                    foreach (Color originalColor in originalPalette.Entries)
                    {
                        newPalette.Entries[index] = Color.FromArgb(255, originalColor);
                        if ((originalColor.ToArgb() == transparentArgb)) transparentIndex = index;
                        index++;
                    }

                    if ((transparentIndex == -1)) return originalBitMapMemoryStream;

                    newPalette.Entries[transparentIndex] = Color.FromArgb(0, transparentColor);
                    newBitmap.Palette = newPalette;

                    Rectangle rect = new Rectangle(0, 0, originalBitmap.Width, originalBitmap.Height);
                    System.Drawing.Imaging.BitmapData originalBitMapData = originalBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, originalBitmap.PixelFormat);
                    System.Drawing.Imaging.BitmapData newBitMapData = newBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.WriteOnly, newBitmap.PixelFormat);

                    for (int y = 0; y < originalBitmap.Height; y++)
                    {
                        for (int x = 0; x < originalBitmap.Width; x++)
                        {
                            Byte originalBitMapByte = System.Runtime.InteropServices.Marshal.ReadByte(originalBitMapData.Scan0, originalBitMapData.Stride * y + x);
                            System.Runtime.InteropServices.Marshal.WriteByte(newBitMapData.Scan0, newBitMapData.Stride * y + x, originalBitMapByte);

                        }
                    }

                    newBitmap.UnlockBits(newBitMapData);
                    originalBitmap.UnlockBits(originalBitMapData);

                    MemoryStream m = new MemoryStream();
                    newBitmap.Save(m, System.Drawing.Imaging.ImageFormat.Gif);
                    return m;

                }
            }


        }
        
        public static void MakeTransparentGIF(ref Bitmap bmp, Color transparentColor)
        {
            MemoryStream ms = new MemoryStream();

            try
            {
                bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
                ms = MakeTransparentGIF(ms, Color.Black);
                bmp = (Bitmap)(Bitmap.FromStream(ms));
            }

            catch (Exception ex) { throw; }


        }




        
        
        
        
        
        
        private static string fileOutput(string file, img.FormatoOutput formatoOutput)
        {
            return Path.Combine(Path.GetDirectoryName(file), Path.GetFileNameWithoutExtension(file)) + "." + formatoOutput.ToString();
        }

        

    }
}