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

标签 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# 中有没有更好的旋转图像的解决方案。我只想将图像旋转到一个角度而不向两侧倾斜,然后以反角旋转图像以取消应用的旋转,因此恢复了以前的图像。

最佳答案

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

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

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

关于c# - 在 C# 中使用 Translate Transform 顺时针和逆时针旋转图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7962530/

相关文章:

c# - 将任何控件与滚动条一起使用时,不会触发 MouseWheel 事件(在 C# Windows 窗体中)

c# - 获取给定进程的文件句柄

c# - 我如何确定添加 2 个数字是否涉及重组/结转或减去 2 个数字是否涉及借用?

c# - 立即窗口中的动态导致 'Microsoft.CSharp.RuntimeBinder.Binder' is not defined or imported 错误

c# - 在 C# 中,如何在不破坏编码的情况下将网页保存到文件?

c# - MVC Razor 需要获取 Substring

c# - Docker抛出异常,因为无法解析远程名称

python - 选择更大的球

c - 获取 JPEG 冗余数据

python-3.x - 在 Python 中将 RGBA 转换为 RGB