这是我用来旋转的代码:
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稍慢。
答案 0 :(得分:2)
RotateAt
使用公式和悲伤进行旋转,因为当旋转90度以外的任何其他值时,这是必要的。如果您要以90度为增量进行旋转,请使用RotateFlip
,这样效率更高,更准确。
答案 1 :(得分:0)
在旋转图像,GDI +将图像移动1个像素或如果尝试手动“固定”坐标时裁剪1个像素的边框时,我遇到了同样的问题。
找到了解决方案:
graphics.SetPixelOffsetMode( Gdiplus::PixelOffsetMode::PixelOffsetModeHalf );