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