Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I rotate a picture in WinForms

Tags:

c#

image

winforms

I want to have one picture in my application that I can rotate to indicate directions, like wind direction. Or even the time. What code do I use to rotate the picture? Thanks

Update: I am using .NET 2.0, Windows 2000, VS C# 2005

like image 926
Arlen Beiler Avatar asked Jan 29 '10 17:01

Arlen Beiler


People also ask

How do I rotate an image in Windows form?

Image = (Image)(RotateImg(bitmap, 30.0f)); The preceding two lines of code will first convert the image in pictureBox1 to a Bitmap image and then it will call our function RotateImg to rotate the image 30 degrees (for example).


2 Answers

Here's a method you can use to rotate an image in C#:

/// <summary> /// method to rotate an image either clockwise or counter-clockwise /// </summary> /// <param name="img">the image to be rotated</param> /// <param name="rotationAngle">the angle (in degrees). /// NOTE:  /// Positive values will rotate clockwise /// negative values will rotate counter-clockwise /// </param> /// <returns></returns> public static Image RotateImage(Image img, float rotationAngle) {     //create an empty Bitmap image     Bitmap bmp = new Bitmap(img.Width, img.Height);      //turn the Bitmap into a Graphics object     Graphics gfx = Graphics.FromImage(bmp);      //now we set the rotation point to the center of our image     gfx.TranslateTransform((float)bmp.Width / 2, (float)bmp.Height / 2);      //now rotate the image     gfx.RotateTransform(rotationAngle);      gfx.TranslateTransform(-(float)bmp.Width / 2, -(float)bmp.Height / 2);      //set the InterpolationMode to HighQualityBicubic so to ensure a high     //quality image once it is transformed to the specified size     gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;      //now draw our new image onto the graphics object     gfx.DrawImage(img, new Point(0, 0));      //dispose of our Graphics object     gfx.Dispose();      //return the image     return bmp; } 
like image 59
Tony The Lion Avatar answered Sep 21 '22 20:09

Tony The Lion


This is an old thread, and there are several other threads about C# WinForms image rotation, but now that I've come up with my solution I figure this is as good a place to post it as any.

  /// <summary>   /// Method to rotate an Image object. The result can be one of three cases:   /// - upsizeOk = true: output image will be larger than the input, and no clipping occurs    /// - upsizeOk = false & clipOk = true: output same size as input, clipping occurs   /// - upsizeOk = false & clipOk = false: output same size as input, image reduced, no clipping   ///    /// A background color must be specified, and this color will fill the edges that are not    /// occupied by the rotated image. If color = transparent the output image will be 32-bit,    /// otherwise the output image will be 24-bit.   ///    /// Note that this method always returns a new Bitmap object, even if rotation is zero - in    /// which case the returned object is a clone of the input object.    /// </summary>   /// <param name="inputImage">input Image object, is not modified</param>   /// <param name="angleDegrees">angle of rotation, in degrees</param>   /// <param name="upsizeOk">see comments above</param>   /// <param name="clipOk">see comments above, not used if upsizeOk = true</param>   /// <param name="backgroundColor">color to fill exposed parts of the background</param>   /// <returns>new Bitmap object, may be larger than input image</returns>   public static Bitmap RotateImage(Image inputImage, float angleDegrees, bool upsizeOk,                                     bool clipOk, Color backgroundColor)   {      // Test for zero rotation and return a clone of the input image      if (angleDegrees == 0f)         return (Bitmap)inputImage.Clone();       // Set up old and new image dimensions, assuming upsizing not wanted and clipping OK      int oldWidth = inputImage.Width;      int oldHeight = inputImage.Height;      int newWidth = oldWidth;      int newHeight = oldHeight;      float scaleFactor = 1f;       // If upsizing wanted or clipping not OK calculate the size of the resulting bitmap      if (upsizeOk || !clipOk)      {         double angleRadians = angleDegrees * Math.PI / 180d;          double cos = Math.Abs(Math.Cos(angleRadians));         double sin = Math.Abs(Math.Sin(angleRadians));         newWidth = (int)Math.Round(oldWidth * cos + oldHeight * sin);         newHeight = (int)Math.Round(oldWidth * sin + oldHeight * cos);      }       // If upsizing not wanted and clipping not OK need a scaling factor      if (!upsizeOk && !clipOk)      {         scaleFactor = Math.Min((float)oldWidth / newWidth, (float)oldHeight / newHeight);         newWidth = oldWidth;         newHeight = oldHeight;      }       // Create the new bitmap object. If background color is transparent it must be 32-bit,       //  otherwise 24-bit is good enough.      Bitmap newBitmap = new Bitmap(newWidth, newHeight, backgroundColor == Color.Transparent ?                                        PixelFormat.Format32bppArgb : PixelFormat.Format24bppRgb);      newBitmap.SetResolution(inputImage.HorizontalResolution, inputImage.VerticalResolution);       // Create the Graphics object that does the work      using (Graphics graphicsObject = Graphics.FromImage(newBitmap))      {         graphicsObject.InterpolationMode = InterpolationMode.HighQualityBicubic;         graphicsObject.PixelOffsetMode = PixelOffsetMode.HighQuality;         graphicsObject.SmoothingMode = SmoothingMode.HighQuality;          // Fill in the specified background color if necessary         if (backgroundColor != Color.Transparent)            graphicsObject.Clear(backgroundColor);          // Set up the built-in transformation matrix to do the rotation and maybe scaling         graphicsObject.TranslateTransform(newWidth / 2f, newHeight / 2f);          if (scaleFactor != 1f)            graphicsObject.ScaleTransform(scaleFactor, scaleFactor);          graphicsObject.RotateTransform(angleDegrees);         graphicsObject.TranslateTransform(-oldWidth / 2f, -oldHeight / 2f);          // Draw the result          graphicsObject.DrawImage(inputImage, 0, 0);      }       return newBitmap;   } 

This is the result of many sources of inspiration, here at StackOverflow and elsewhere. Naveen's answer on this thread was especially helpful.

like image 31
RenniePet Avatar answered Sep 21 '22 20:09

RenniePet