首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Graphics.RotateTransform不工作

Graphics.RotateTransform不工作
EN

Stack Overflow用户
提问于 2015-01-17 12:07:25
回答 2查看 1.7K关注 0票数 1

我不知道为什么它不能工作。

代码语言:javascript
复制
    Bitmap img = (Bitmap)Properties.Resources.myBitmap.Clone();
    Graphics g = Graphics.FromImage(img);
    g.RotateTransform(45);
    pictureBox1.Image = img;

图像将会显示,但不会旋转。

EN

回答 2

Stack Overflow用户

发布于 2015-01-17 14:02:54

一种是使用Graphics实例进行绘制。仅当绘制到用于创建Graphics实例的对象时,对Graphics实例的更改才会影响该对象。这包括转换。简单地从位图对象创建一个Graphics实例并更改其变换不会有任何效果(如您所发现的)。

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

代码语言:javascript
复制
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;
}

你可以这样使用它:

代码语言:javascript
复制
pictureBox1.Image = RotateImage(Properties.Resources.myBitmap);

但是,您会注意到,因为新位图与旧位图具有相同的尺寸,所以在新位图中旋转图像会导致边缘裁剪。

您可以修复此问题(如果需要,请使用…通过计算基于旋转的位图的新边界;将位图的角点传递给Matrix.TransformPoints()方法,然后找到X和Y坐标的最小和最大值来创建新的边界矩形,最后使用宽度和高度来创建一个新的位图,最后使用宽度和高度创建一个新的位图,您可以将旧的位图旋转到其中而不进行裁剪。

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

票数 2
EN

Stack Overflow用户

发布于 2015-01-17 12:40:02

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

请尝试使用g.DrawImage(...) see here显示图像

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27996037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档