Graphics.RotateTransform无法正常工作

时间:2015-01-17 04:07:25

标签: c# graphics rotatetransform

我不确定为什么它不起作用......

    Bitmap img = (Bitmap)Properties.Resources.myBitmap.Clone();
    Graphics g = Graphics.FromImage(img);
    g.RotateTransform(45);
    pictureBox1.Image = img;

显示图像,但不会旋转。

2 个答案:

答案 0 :(得分:1)

您正在旋转图形界面,但不使用它来绘制图像。图片框控件很简单,可能不是你的朋友。

尝试使用g.DrawImage(...) see here来显示图片

答案 1 :(得分:1)

使用Graphics实例绘制。只有在绘制到该对象时,对Graphics实例的更改才会影响用于创建Graphics实例的对象。这包括转型。只需从位图对象创建Graphics实例并更改其变换就不会产生任何影响(正如您所发现的那样)。

以下方法将创建一个新的Bitmap对象,传递给它的原始文件的旋转版本:

private Image RotateImage(Bitmap bitmap)
{
    PointF centerOld = new PointF((float)bitmap.Width / 2, (float)bitmap.Height / 2);
    Bitmap newBitmap = new Bitmap(bitmap.Width, bitmap.Height, bitmap.PixelFormat);

    // Make sure the two coordinate systems are the same
    newBitmap.SetResolution(bitmap.HorizontalResolution, bitmap.VerticalResolution);

    using (Graphics g = Graphics.FromImage(newBitmap))
    {
        Matrix matrix = new Matrix();

        // Rotate about old image center point
        matrix.RotateAt(45, centerOld);

        g.Transform = matrix;
        g.DrawImage(bitmap, new Point());
    }

    return newBitmap;
}

您可以像这样使用它:

pictureBox1.Image = RotateImage(Properties.Resources.myBitmap);

但是,您会注意到,由于新位图与旧位图的尺寸相同,因此在新位图内旋转图像会导致边缘裁剪。

你可以通过根据旋转计算位图的新边界来解决这个问题(如果需要......从你的问题中看不清楚它是否存在);将位图的角点传递给Matrix.TransformPoints()方法,然后找到X和Y坐标的最小值和最大值以创建新的边界矩形,最后使用宽度和高度创建一个新的位图到其中可以在不裁剪的情况下旋转旧的。

最后,请注意,这一切都非常复杂,主要是因为您正在使用Winforms。 WPF对旋转可视元素有更好的支持,所有这一切都可以通过操作用于显示位图的WPF Image控件来完成。