Graphics.RotateTransform 不起作用



我不知道为什么它不起作用...

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

将显示图像,但不旋转。

使用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控件即可完成所有操作。

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

尝试使用此处g.DrawImage(...)来显示图像

相关内容

  • 没有找到相关文章

最新更新