2012-04-22 71 views
0

我需要通過旋轉圖像解決的一個問題,但我有這樣的代碼將圖像旋轉不旋轉完全如何旋轉圖片框

public static Image RotateImage(Image img, float rotationAngle) 
     { 
      //create an empty Bitmap image 
      Bitmap bmp = new Bitmap(img.Width, img.Height); 

      //turn the Bitmap into a Graphics object 
      Graphics gfx = Graphics.FromImage(bmp); 

      //now we set the rotation point to the center of our image 
      gfx.TranslateTransform((float)bmp.Width/2, (float)bmp.Height/2); 

      //now rotate the image 
      gfx.RotateTransform(rotationAngle); 

      gfx.TranslateTransform(-(float)bmp.Width/2, -(float)bmp.Height/2); 

      //set the InterpolationMode to HighQualityBicubic so to ensure a high 
      //quality image once it is transformed to the specified size 
      gfx.InterpolationMode = InterpolationMode.HighQualityBicubic; 

      //now draw our new image onto the graphics object 
      gfx.DrawImage(img, new System.Drawing.Point(0, 0)); 

      //dispose of our Graphics object 
      gfx.Dispose(); 

      //return the image 
      return bmp; 
     } 

並使用它來調用方法。右邊是旋轉包含圖像的矩形,並避免切割圖像

Bitmap bitmap = (Bitmap)Pix.Image; 
Pix.Image = (Bitmap)(RotateImage(bitmap, 20.0f)); 
+0

可能重複[LockBits圖像旋轉方法不工作?](http://stackoverflow.com/questions/3860030/lockbits-image-rotation-method-not-working) – 2012-04-22 17:42:47

回答

1
private Bitmap RotateImageByAngle(Image oldBitmap, float angle) 
{ 
    var newBitmap = new Bitmap(oldBitmap.Width, oldBitmap.Height); 
    newBitmap.SetResolution(oldBitmap.HorizontalResolution, oldBitmap.VerticalResolution); 
    var graphics = Graphics.FromImage(newBitmap); 
    graphics.TranslateTransform((float)oldBitmap.Width/2, (float)oldBitmap.Height/2); 
    graphics.RotateTransform(angle); 
    graphics.TranslateTransform(-(float)oldBitmap.Width/2, -(float)oldBitmap.Height/2); 
    graphics.DrawImage(oldBitmap, new Point(0, 0)); 
    return newBitmap; 
} 
+0

這種解釋是很不錯的。我可以旋轉圖像沒有任何問題,但唯一的細節是旋轉圖像失去分辨率。爲什麼這樣做? – Fabio 2012-04-22 19:51:20

0

我已經在過去使用下面的代碼從本文。 http://www.switchonthecode.com/tutorials/csharp-tutorial-image-editing-rotate 還有其他一些解決方案。的

/// <summary> 
/// Rotates the input image by theta degrees around center. 
/// </summary> 
public static Bitmap rotateCenter(Bitmap bmpSrc, float theta) 
{ 
    Matrix mRotate = new Matrix(); 
    mRotate.Translate(bmpSrc.Width/-2, bmpSrc.Height/-2, MatrixOrder.Append); 
    mRotate.RotateAt(theta, new Point(0, 0), MatrixOrder.Append); 
    using (GraphicsPath gp = new GraphicsPath()) 
    { // transform image points by rotation matrix 
     gp.AddPolygon(new Point[] { new Point(0, 0), new Point(bmpSrc.Width, 0), new Point(0, bmpSrc.Height) }); 
     gp.Transform(mRotate); 
     PointF[] pts = gp.PathPoints; 

     // create destination bitmap sized to contain rotated source image 
     Rectangle bbox = boundingBox(bmpSrc, mRotate); 
     Bitmap bmpDest = new Bitmap(bbox.Width, bbox.Height); 

     using (Graphics gDest = Graphics.FromImage(bmpDest)) 
     { // draw source into dest 
      Matrix mDest = new Matrix(); 
      mDest.Translate(bmpDest.Width/2, bmpDest.Height/2, MatrixOrder.Append); 
      gDest.Transform = mDest; 
      gDest.DrawImage(bmpSrc, pts); 
      //drawAxes(gDest, Color.Red, 0, 0, 1, 100, ""); 
      return bmpDest; 
     } 
    } 
} 

private static Rectangle boundingBox(Image img, Matrix matrix) 
{ 
    GraphicsUnit gu = new GraphicsUnit(); 
    Rectangle rImg = Rectangle.Round(img.GetBounds(ref gu)); 

    // Transform the four points of the image, to get the resized bounding box. 
    Point topLeft = new Point(rImg.Left, rImg.Top); 
    Point topRight = new Point(rImg.Right, rImg.Top); 
    Point bottomRight = new Point(rImg.Right, rImg.Bottom); 
    Point bottomLeft = new Point(rImg.Left, rImg.Bottom); 
    Point[] points = new Point[] { topLeft, topRight, bottomRight, bottomLeft }; 
    GraphicsPath gp = new GraphicsPath(points, 
                 new byte[] { (byte)PathPointType.Start, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line }); 
    gp.Transform(matrix); 
    return Rectangle.Round(gp.GetBounds()); 
}