tags:

views:

592

answers:

2

I'm trying to rotate a bitmap 90 degrees using the following function. The problem with it is that it cuts off part of the image when the height and width are not equal.

Notice the returnBitmap width = original.height and it's height = original.width

Can anyone help me solve this issue or point out what I'm doing wrong?

    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;
    }
+9  A: 

What about this:

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);
    }
}
Rubens Farias
the bitmap I'm rotating is only for display purposes. I never save it to a file
Kevin
you dont need to save it; that `RotateFlip` will do the trick. You can to remove that `using` and to add a `return new Bitmap(img);`
Rubens Farias
Looks good to me. I'll be back in 43 minutes for your +1 :-D
Cory Charlton
+1 works great.
Kevin
+2  A: 

The bug is in your first call to TranslateTransform:

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

This transform needs to be in the coordinate space of returnBitmap rather than b, so this should be:

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

or equivalently

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

Your second TranslateTransform is correct, because it will be applied before the rotation.

However you're probably better off with the simpler RotateFlip method, as Rubens Farias suggested.

finnw