2012-04-22 9 views
0

を回転させるためにどのように画像を回転させることで、問題を解決する必要がありますが、私は完全にのPictureBox

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; 
     } 

を回転させ、メソッドを呼び出すためにこれを使用していない画像を回転するには、このコードを持っています。権利は含まれていた画像の矩形を回転させ、画像Iが過去にこの記事から、次のコードを使用している

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) –

答えて

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

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()); 
}