2010-05-24 32 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

相關問題