我正在使用以下代码以中心点为原点将图像旋转一个角度。
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/