The title says it all. There are some looooong and hungry algorithms for doing so, but as of yet I haven't come up with or found anything particularly fast.
views:
91answers:
3
A:
void Graphics.RotateTransform(float angle);
This should rotate the image in C#. What is it doing instead?
I haven't experimented too much with GDI+. Remember to reverse the rotation after the image is drawn.
Sion Sheevok
2010-09-21 02:59:27
It does, but not without clipping.
Bloodyaugust
2010-09-21 03:56:50
See: http://www.switchonthecode.com/tutorials/csharp-tutorial-image-editing-rotate
Michael
2010-09-21 05:22:55
One of the comments solves the clipping problem, but doesn't (accurately) rotate around a center point. See the comment made by anonymous at 03/23/2009 - 22:23.
Bloodyaugust
2010-09-21 05:30:43
@Michael: You may want to put that as an answer, not as a comment on my incorrect answer. ^^()
Sion Sheevok
2010-09-21 06:20:46
+1
A:
The fastest way is to this is to use unsafe calls to manipulate the image memory directly using LockBits
. It sounds scary but it's pretty straight forward. If you search for LockBits you'll find plently of examples such as here.
The interesting bit is:
BitmapData originalData = originalBitmap.LockBits(
new Rectangle(0, 0, originalWidth, originalHeight),
ImageLockMode.ReadOnly,
PixelFormat.Format32bppRgb);
Once you have the BitmapData you can pass the pixels and map them into a new image (again using LockBits). This is significantly quicker than using the Graphics
API.
TheCodeKing
2010-09-27 20:46:01
BTW the correct (and slower) way to do this using the Graphics API without clipping is http://stackoverflow.com/questions/2352804/how-do-i-prevent-clipping-when-rotating-an-image-in-c.
TheCodeKing
2010-09-27 20:55:57
The first (unaccepted) answer is what I assume you're referring to?
Bloodyaugust
2010-09-27 22:57:12
I awarded the bounty to you, because you led me to my eventual answer, although it wasn't LockBits. Turns out I had to use safe code only... meh.
Bloodyaugust
2010-09-28 05:13:53
@Bloodyaugust I just meant how to impelement rotation without clipping using the graphics API. I wasn't referring to the previous answer directly :)
TheCodeKing
2010-09-28 06:05:18
A:
Here's what I ended up doing (after an extensive amount of continued research, and the helpful link provided by TheCodeKing):
public Image RotateImage(Image img, float rotationAngle)
{
// When drawing the returned image to a form, modify your points by
// (-(img.Width / 2) - 1, -(img.Height / 2) - 1) to draw for actual co-ordinates.
//create an empty Bitmap image
Bitmap bmp = new Bitmap((img.Width * 2), (img.Height *2));
//turn the Bitmap into a Graphics object
Graphics gfx = Graphics.FromImage(bmp);
//set the point system origin to the center of our image
gfx.TranslateTransform((float)bmp.Width / 2, (float)bmp.Height / 2);
//now rotate the image
gfx.RotateTransform(rotationAngle);
//move the point system origin back to 0,0
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;
//draw our new image onto the graphics object with its center on the center of rotation
gfx.DrawImage(img, new PointF((img.Width / 2), (img.Height / 2)));
//dispose of our Graphics object
gfx.Dispose();
//return the image
return bmp;
}
Cheers!
Bloodyaugust
2010-09-28 05:12:40