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();
}
}
}