0

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

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));
4

2 回答 2

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;
}
于 2012-04-22T17:52:30.120 回答
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());
}
于 2012-04-22T18:18:59.367 回答