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

本文关键字:逆时针 旋转 图像 顺时针 Transform 中的 Translate 使用 | 更新日期: 2023-09-27 18:13:02

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

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#。我只是想将图像旋转到一个角度,而不使图像的两侧像差,然后以相反的角度旋转图像以取消应用的旋转,因此恢复了之前的图像。

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

首先,正如在评论中所说,您需要创建一个更大的目标位图来容纳旋转的位图。这将得到正确的新尺寸:

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)));
}

然后,至于恢复(旋转回)位图,我不建议你尝试这样做。尽量保留原来的位图。这将是棘手的恢复它,如果你成功了,你将失去图像质量无论如何。