【问题标题】:Rotating image clockwise and anticlock wise using Translate Transform in c#在c#中使用Translate Transform顺时针和逆时针旋转图像
【发布时间】:2011-12-19 05:41:51
【问题描述】:

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

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-anglerotated) 的角度来做到这一点。但这不起作用并且边缘的图像似乎被削减。 有没有更好的解决方案在c#中旋转图像。我只是想将图像旋转到一个角度而不会向两侧倾斜,然后以反角旋转图像以取消应用的旋转,因此恢复以前的图像。

【问题讨论】:

  • 似乎目标图像必须大于源图像并将其绘制在中心。
  • 是切边还是切角?
  • @leppie 是的。角落被剪掉了。
  • 使目标位图的宽度和高度等于sqrt(w^2 + h^2)
  • @leppie 我不明白目标位图是什么意思,这种调整大小会影响原始图像。

标签: c# .net image graphics drawing


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    相关资源
    最近更新 更多