2011-11-01 116 views
3

我使用下面的代碼通過以中心點爲原點的角度旋轉圖像。使用c中的平移變換順時針和逆時針旋轉圖像#

private Bitmap rotateImage(Bitmap b, float angle) 
{ 
     Bitmap returnBitmap = new Bitmap(b.Width, b.Height); 
     Graphics g = Graphics.FromImage(returnBitmap); 
     g.TranslateTransform((float)b.Width/2, (float)b.Height/2); 
     g.RotateTransform(angle); 
     g.TranslateTransform(-(float)b.Width/2,-(float)b.Height/2); 
     g.DrawImage(b, new Point(0, 0)); 
     return returnBitmap; 
} 

,就會出現問題,當我嘗試旋轉之後將圖像恢復到其初始的角度performed.I打算通過的角度再次旋轉圖像來做到這一點(360 anglerotated),但這不是工作和圖像的邊緣似乎被削減。 有沒有更好的解決方案來旋轉c#中的圖像。我只是想旋轉圖像到一個角度而沒有向兩側彎曲,然後以對角度旋轉圖像以取消所施加的旋轉,因此前一圖像被恢復。

+0

似乎目標圖像必須大於源代碼並將其繪製在中心。 –

+0

它被切割的邊緣或角落? – leppie

+0

@leppie是的。角落被切斷。 – techno

回答

2

首先,正如評論中所述,您需要創建一個更大的目標位圖來適應旋轉的位圖。這將讓你正確的新大小:

public Size SizeAfterRotation(Size sz, float angle) 
{ 
    var m = new Matrix(); 
    m.Rotate(angle); 
    var pts = new[] 
        { 
         new Point(sz.Width, sz.Height), 
         new Point(sz.Width, 0) 
        }; 
    m.TransformPoints(pts); 
    return new Size(
     Math.Max(Math.Abs(pts[0].X), Math.Abs(pts[1].X)), 
     Math.Max(Math.Abs(pts[0].Y), Math.Abs(pts[1].Y))); 
} 

然後,作爲恢復(迴轉動)的位圖,我不會reccomand您嘗試這樣做。嘗試保持原來的位圖。恢復它會很棘手,如果你成功了,反正你會失去圖像質量。