使用c#中的Translate Transform顺时针旋转图像并逆时针旋转

时间:2011-11-01 04:41:36

标签: c# .net image graphics drawing

我正在使用以下代码将图像旋转一个角度,以中心点为原点。

private Bitmap rotateImage(Bitmap b, float angle)
{
       Bitmap returnBitmap = new Bitmap(b.Width, b.Height);
       Graphics g = Graphics.FromImage(returnBitmap);
       g.TranslateTransform((float)b.Width/2, (float)b.Height / 2);
       g.RotateTransform(angle);
       g.TranslateTransform(-(float)b.Width/2,-(float)b.Height / 2);
       g.DrawImage(b, new Point(0, 0));
       return returnBitmap;
} 

当我尝试在执行旋转后将图像恢复到其初始角度时出现问题。我打算通过再次旋转角度(360度旋转)来完成此操作。但这不起作用和边缘图像似乎被切断了。 是否有更好的解决方案在c#中旋转图像。我只想将图像旋转到一个角度而不会偏向两侧,然后以反角度旋转图像以取消应用的旋转,以便恢复前一个图像。 / p>

1 个答案:

答案 0 :(得分:2)

首先,正如评论中所说,您需要创建一个更大的目标位图来适应旋转的位图。这将为您提供正确的新尺寸:

public Size SizeAfterRotation(Size sz, float angle)
{
    var m = new Matrix();
    m.Rotate(angle);
    var pts = new[]
                  {
                      new Point(sz.Width, sz.Height),
                      new Point(sz.Width, 0)
                  };
    m.TransformPoints(pts);
    return new Size(
        Math.Max(Math.Abs(pts[0].X), Math.Abs(pts[1].X)),
        Math.Max(Math.Abs(pts[0].Y), Math.Abs(pts[1].Y)));
}

然后,至于恢复(向后旋转)位图,我不会重新尝试你尝试这样做。请尝试保留原始位图。恢复它会很棘手,如果你成功了,无论如何你都会失去图像质量。