C#旋转位图90度

我正在尝试使用以下函数将位图旋转90度。 它的问题是,当高度和宽度不相等时,会切断部分图像。

注意returnBitmap的width = original.height,它的height = original.width

任何人都可以帮我解决这个问题,或指出我做错了什么?

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

这个怎么样:

 private void RotateAndSaveImage(String input, String output) { //create an object that we can use to examine an image file using (Image img = Image.FromFile(input)) { //rotate the picture by 90 degrees and re-save the picture as a Jpeg img.RotateFlip(RotateFlipType.Rotate90FlipNone); img.Save(output, System.Drawing.Imaging.ImageFormat.Jpeg); } } 

这个错误是你第一次调用TranslateTransform

 g.TranslateTransform((float)b.Width / 2, (float)b.Height / 2); 

这个转换需要在returnBitmap的坐标空间而不是b ,所以这应该是:

 g.TranslateTransform((float)b.Height / 2, (float)b.Width / 2); 

或等同地

 g.TranslateTransform((float)returnBitmap.Width / 2, (float)returnBitmap.Height / 2); 

您的第二个TranslateTransform是正确的,因为它将在旋转之前应用。

但是,Rubens Fariasbuild议,使用更简单的RotateFlip方法可能会更好。

我碰到了一点点修改,我就开始工作了。 我发现了一些其他的例子,并注意到一些对我造成影响的东西。 我不得不打电话SetResolution,如果我没有图像结束了错误的大小。 我也注意到“高度”和“宽度”是倒退的,尽pipe我认为无论如何都会对非方形图像进行一些修改。 我想我会把这个发布给任何遇到这个问题的人,就像我在做同样的问题。

这是我的代码

 private static void RotateAndSaveImage(string input, string output, int angle) { //Open the source image and create the bitmap for the rotatated image using (Bitmap sourceImage = new Bitmap(input)) using (Bitmap rotateImage = new Bitmap(sourceImage.Width, sourceImage.Height)) { //Set the resolution for the rotation image rotateImage.SetResolution(sourceImage.HorizontalResolution, sourceImage.VerticalResolution); //Create a graphics object using (Graphics gdi = Graphics.FromImage(rotateImage)) { //Rotate the image gdi.TranslateTransform((float)sourceImage.Width / 2, (float)sourceImage.Height / 2); gdi.RotateTransform(angle); gdi.TranslateTransform(-(float)sourceImage.Width / 2, -(float)sourceImage.Height / 2); gdi.DrawImage(sourceImage, new System.Drawing.Point(0, 0)); } //Save to a file rotateImage.Save(output); } }