Rotating graphics?

前端 未结 5 1343
悲&欢浪女
悲&欢浪女 2020-12-06 02:07

I have this code, that draws an image.

private void timer1_Tick(object sender, EventArgs e)
{
    Invalidate();
}

protected override void OnPaint(PaintEvent         


        
相关标签:
5条回答
  • 2020-12-06 02:11

    Use Graphics.RotateTransform to rotate the image.

    protected override void OnPaint(PaintEventArgs e)
    {
        var tempRocket = new Bitmap(Properties.Resources.rocket);
    
        e.Graphics.RotateTransform(30.0F); 
    
        e.Graphics.DrawImage(tempRocket, 150, 150);
    }
    
    0 讨论(0)
  • 2020-12-06 02:16
    public static Bitmap RotateImage(Bitmap b, float angle)
    {
      //create a new empty bitmap to hold rotated image
      Bitmap returnBitmap = new Bitmap(b.Width, b.Height);
      //make a graphics object from the empty bitmap
      using(Graphics g = Graphics.FromImage(returnBitmap)) 
      {
          //move rotation point to center of image
          g.TranslateTransform((float)b.Width / 2, (float)b.Height / 2);
          //rotate
          g.RotateTransform(angle);
          //move image back
          g.TranslateTransform(-(float)b.Width / 2, -(float)b.Height / 2);
          //draw passed in image onto graphics object
          g.DrawImage(b, new Point(0, 0)); 
      }
      return returnBitmap;
    }
    
    0 讨论(0)
  • 2020-12-06 02:16

    There are overloads of Graphics.DrawImage that take an array of three points used to define a parallelogram for the destination, such as:

    Graphics.DrawImage Method (Image, Point[])

    Remarks

    The destPoints parameter specifies three points of a parallelogram. The three Point structures represent the upper-left, upper-right, and lower-left corners of the parallelogram. The fourth point is extrapolated from the first three to form a parallelogram.

    The image represented by the image parameter is scaled and sheared to fit the shape of the parallelogram specified by the destPoints parameters.

    There is also an article on MSDN describing the use of this method: How to: Rotate, Reflect, and Skew Images, with the following code example. Unfortunately, the example complicates the issue by also skewing the image.

    Point[] destinationPoints = {
              new Point(200, 20),   // destination for upper-left point of original
              new Point(110, 100),  // destination for upper-right point of original
              new Point(250, 30)};  // destination for lower-left point of original
    
    Image image = new Bitmap("Stripes.bmp");
    
    // Draw the image unaltered with its upper-left corner at (0, 0).
    e.Graphics.DrawImage(image, 0, 0);
    
    // Draw the image mapped to the parallelogram.
    e.Graphics.DrawImage(image, destinationPoints);
    

    The main differences compared to using the Graphics.Transform property are:

    • This method does not allow you to specify the rotation angle in degrees -- you have to use some simple trigonometry to derive the points.
    • This transformation applies only to the specific image.
      • Good if you only need to draw one rotated image and everything else is non-rotated since you don't have to reset Graphics.Transform afterward.
      • Bad if you want to rotate several things together (i.e., rotate the "camera").
    0 讨论(0)
  • 2020-12-06 02:26

    Version without clipping:

    private Bitmap RotateBitmap(Bitmap bitmap, float angle)
        {
            int w, h, x, y;
            var dW = (double)bitmap.Width;
            var dH = (double)bitmap.Height;
    
            double degrees = Math.Abs(angle);
            if (degrees <= 90)
            {
                double radians = 0.0174532925 * degrees;
                double dSin = Math.Sin(radians);
                double dCos = Math.Cos(radians);
                w = (int)(dH * dSin + dW * dCos);
                h = (int)(dW * dSin + dH * dCos);
                x = (w - bitmap.Width) / 2;
                y = (h - bitmap.Height) / 2;
            }
            else
            {
                degrees -= 90;
                double radians = 0.0174532925 * degrees;
                double dSin = Math.Sin(radians);
                double dCos = Math.Cos(radians);
                w = (int)(dW * dSin + dH * dCos);
                h = (int)(dH * dSin + dW * dCos);
                x = (w - bitmap.Width) / 2;
                y = (h - bitmap.Height) / 2;
            }
    
            var rotateAtX = bitmap.Width / 2f;
            var rotateAtY = bitmap.Height / 2f;
    
            var bmpRet = new Bitmap(w, h);
            bmpRet.SetResolution(bitmap.HorizontalResolution, bitmap.VerticalResolution);
            using (var graphics = Graphics.FromImage(bmpRet))
            {
                graphics.Clear(Color.White);
                graphics.TranslateTransform(rotateAtX + x, rotateAtY + y);
                graphics.RotateTransform(angle);
                graphics.TranslateTransform(-rotateAtX - x, -rotateAtY - y);
                graphics.DrawImage(bitmap, new PointF(0 + x, 0 + y));
            }
            return bmpRet;
        }
    

    Primary source

    0 讨论(0)
  • 2020-12-06 02:35

    You need to apply transformation matrix. Here you can find good example about transformations in GDI+

    0 讨论(0)
提交回复
热议问题