如何旋转图片框

时间:2012-04-22 17:30:50

标签: c# winforms picturebox

我需要通过旋转图像来解决问题,但我有这个代码来旋转图像不会完全旋转

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 System.Drawing.Point(0, 0));

            //dispose of our Graphics object
            gfx.Dispose();

            //return the image
            return bmp;
        }

并使用此方法调用方法。右边是旋转包含的图像矩形,并避免剪切图像

Bitmap bitmap = (Bitmap)Pix.Image;
Pix.Image = (Bitmap)(RotateImage(bitmap, 20.0f));

2 个答案:

答案 0 :(得分:1)

private Bitmap RotateImageByAngle(Image oldBitmap, float angle)
{
    var newBitmap = new Bitmap(oldBitmap.Width, oldBitmap.Height);
    newBitmap.SetResolution(oldBitmap.HorizontalResolution, oldBitmap.VerticalResolution);
    var graphics = Graphics.FromImage(newBitmap);
    graphics.TranslateTransform((float)oldBitmap.Width / 2, (float)oldBitmap.Height / 2);
    graphics.RotateTransform(angle);
    graphics.TranslateTransform(-(float)oldBitmap.Width / 2, -(float)oldBitmap.Height / 2);
    graphics.DrawImage(oldBitmap, new Point(0, 0));
    return newBitmap;
}

答案 1 :(得分:0)

我过去曾使用过本文中的以下代码。 http://www.switchonthecode.com/tutorials/csharp-tutorial-image-editing-rotate 还有一些其他解决方案。

/// <summary>
/// Rotates the input image by theta degrees around center.
/// </summary>
public static Bitmap rotateCenter(Bitmap bmpSrc, float theta)
{
    Matrix mRotate = new Matrix();
    mRotate.Translate(bmpSrc.Width / -2, bmpSrc.Height / -2, MatrixOrder.Append);
    mRotate.RotateAt(theta, new Point(0, 0), MatrixOrder.Append);
    using (GraphicsPath gp = new GraphicsPath())
    {  // transform image points by rotation matrix
        gp.AddPolygon(new Point[] { new Point(0, 0), new Point(bmpSrc.Width, 0), new Point(0, bmpSrc.Height) });
        gp.Transform(mRotate);
        PointF[] pts = gp.PathPoints;

        // create destination bitmap sized to contain rotated source image
        Rectangle bbox = boundingBox(bmpSrc, mRotate);
        Bitmap bmpDest = new Bitmap(bbox.Width, bbox.Height);

        using (Graphics gDest = Graphics.FromImage(bmpDest))
        {  // draw source into dest
            Matrix mDest = new Matrix();
            mDest.Translate(bmpDest.Width / 2, bmpDest.Height / 2, MatrixOrder.Append);
            gDest.Transform = mDest;
            gDest.DrawImage(bmpSrc, pts);
            //drawAxes(gDest, Color.Red, 0, 0, 1, 100, "");
            return bmpDest;
        }
    }
}

private static Rectangle boundingBox(Image img, Matrix matrix)
{
    GraphicsUnit gu = new GraphicsUnit();
    Rectangle rImg = Rectangle.Round(img.GetBounds(ref gu));

    // Transform the four points of the image, to get the resized bounding box.
    Point topLeft = new Point(rImg.Left, rImg.Top);
    Point topRight = new Point(rImg.Right, rImg.Top);
    Point bottomRight = new Point(rImg.Right, rImg.Bottom);
    Point bottomLeft = new Point(rImg.Left, rImg.Bottom);
    Point[] points = new Point[] { topLeft, topRight, bottomRight, bottomLeft };
    GraphicsPath gp = new GraphicsPath(points,
                                                        new byte[] { (byte)PathPointType.Start, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line });
    gp.Transform(matrix);
    return Rectangle.Round(gp.GetBounds());
}