为什么不应用Graphics.RotateTransform()?

时间:2010-11-30 20:11:39

标签: c# graphics rotatetransform

我有以下功能:

static private Image CropRotate(Image wholeImage, Rectangle cropArea)
{
    Bitmap cropped = new Bitmap(cropArea.Width, cropArea.Height);

    using(Graphics g = Graphics.FromImage(cropped))
    {
        g.DrawImage(wholeImage, new Rectangle(0, 0, cropArea.Width, cropArea.Height), cropArea, GraphicsUnit.Pixel);
        g.RotateTransform(180f);
    }
    return cropped as Image;
}

应该裁剪图像,然后旋转生成的子图像。但实际上,它只执行裁剪。

为什么RotateTransform()没有被应用?

2 个答案:

答案 0 :(得分:5)

您是否尝试将RotateTransform()放在DrawImage()之前? example on the msdn page显示在完成任何绘图之前应用的转换。

答案 1 :(得分:4)

RotateTransform调用会改变当前的转换矩阵,这会对所有后续操作产生影响。它完全转换已经输出的操作。对于任何更改变换矩阵的操作(如ScaleTransform)都是一样的。

确保在之前调用这些来执行您想要转换的操作 - 在这种情况下,在调用DrawImage之前。

您可以使用它来执行类似

的操作
  1. 绘制(不旋转或缩放)
  2. 旋转(仅更改变换矩阵)
  3. 缩放(仅更改变换矩阵)
  4. 绘制(现在旋转并缩放)
  5. ClearTransform(仅更改转换矩阵)
  6. 绘制(不旋转或缩放)
  7. 第一个和最后一个绘制输出将不会被转换,但是中间一个将受到旋转和缩放(按此顺序)的影响。