C# 矩阵中是否存在缺陷。某些角度的旋转法。网络Winforms

C# 矩阵中是否存在缺陷。某些角度的旋转法。网络Winforms,c#,.net,vb.net,gdi+,rotation,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

下面是我用来旋转的代码:

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) 大小600600我知道这只是一个任意大的值,它将适合旋转图像的右侧和底部进行测试。
(4) 我知道,使用这段代码,顶部和左侧边缘将被剪裁,因为在旋转后我不会变换原点

问题仅在某些角度出现:

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

这是已知的bug吗


如果我通过指定一个输出矩形来手动旋转角点并绘制图像,我不会遇到同样的问题-尽管它比使用RotateAt稍微慢一些。

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

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

找到解决方案:

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

所以解决方法是检查角度,如果可以被90整除,则使用RotateFlip,否则使用RotateFlip?这一定是一个常见的问题,我很惊讶我在谷歌上找不到任何关于它的信息。或者在旋转前在整个图像集周围添加一个与相邻像素相等的像素边框,或者在旋转后裁剪一个额外的像素,或者两者兼而有之。使用RotateFlip比这些解决方案更简单,但在角度为89.9或其他任何情况下都没有帮助。