2010-05-24 49 views
1

下面是我使用的旋转代码:在某些角度的Matrix.RotateAt方法中是否存在缺陷? NET WinForms控件

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 x 200的矩形测试代码。
(3)大小600,600它只是一个任意大的值,我知道它将适合旋转图像的右侧和底侧以用于测试目的。
(4)我知道,使用这段代码,顶部和左侧边缘将被裁剪,因为我没有在旋转后变换orgin。

问题仅发生在某些角度:

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

这是一个已知的错误吗?

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

回答

2

RotateAt使用公式和悲伤进行旋转,因为这是必要的时旋转90度增量以外的任何东西。如果要以90度增量旋转,请使用RotateFlip,这更有效且更准确。

+0

所以解决的办法是检查角度和使用RotateFlip如果90整除,否则旋转?这肯定是一个常见问题,我很惊讶我在谷歌上找不到任何关于它的东西。 – Jules 2010-05-24 13:00:53

+0

或者在旋转之前在整个图像集中添加与相邻像素相同的一个像素边框,或者在旋转之后添加一个额外像素,或两者都添加。使用RotateFlip比这些解决方案更简单,但当角度为89.9或其他任何情况下不会对您有所帮助。 – Brian 2010-05-24 13:18:27

相关问题