对于某些角度,Matrix.RotateAt方法中是否存在错误? .Net Winforms

时间:2010-05-24 11:58:38

标签: c# .net vb.net gdi+ rotation

这是我用来旋转的代码:

Dim m As New System.Drawing.Drawing2D.Matrix
Dim size = image.Size
m.RotateAt(degreeAngle, New PointF(CSng(size.Width / 2), CSng(size.Height / 2)))
Dim temp As New Bitmap(600, 600, Imaging.PixelFormat.Format32bppPArgb)
Dim g As Graphics = Graphics.FromImage(temp)
g.Transform = m
g.DrawImage(image, 0, 0)

(1)为简洁起见,取消了处置 (2)我用200×200的矩形测试代码 (3)尺寸600,600它只是一个任意大的值,我知道它将适合旋转图像的右侧和底侧以进行测试。
(4)我知道,使用此代码,顶部和左边将被剪裁,因为我在旋转后没有变换orgin。

问题只发生在某些角度:

(1)在90时,右手边缘完全消失 (2)在180处,右边和底边都在那里,但很褪色 (3)在270处,底部边缘完全消失。

这是一个已知的错误吗?

如果我手动旋转角落,通过指定输出矩形来绘制图像,我不会遇到同样的问题 - 虽然它比使用RotateAt稍慢。

2 个答案:

答案 0 :(得分:2)

RotateAt使用公式和悲伤进行旋转,因为当旋转90度以外的任何其他值时,这是必要的。如果您要以90度为增量进行旋转,请使用RotateFlip,这样效率更高,更准确。

答案 1 :(得分:0)

在旋转图像,GDI +将图像移动1个像素或如果尝试手动“固定”坐标时裁剪1个像素的边框时,我遇到了同样的问题。

找到了解决方案:

   graphics.SetPixelOffsetMode( Gdiplus::PixelOffsetMode::PixelOffsetModeHalf );