diff --git a/src/ImageProcessor/Processors/RotateInside.cs b/src/ImageProcessor/Processors/RotateInside.cs
index 6071b5ae5..e0a24ea89 100644
--- a/src/ImageProcessor/Processors/RotateInside.cs
+++ b/src/ImageProcessor/Processors/RotateInside.cs
@@ -52,12 +52,8 @@ namespace ImageProcessor.Processors
{
RotateInsideLayer rotateLayer = this.DynamicParameter;
- // Center of the image
- float rotateAtX = Math.Abs(image.Width / 2);
- float rotateAtY = Math.Abs(image.Height / 2);
-
// Create a rotated image.
- newImage = this.RotateImage(image, rotateAtX, rotateAtY, rotateLayer);
+ newImage = this.RotateImage(image, rotateLayer);
image.Dispose();
image = newImage;
@@ -79,21 +75,32 @@ namespace ImageProcessor.Processors
/// Rotates the inside of an image to the given angle at the given position.
///
/// The image to rotate
- /// The horizontal pixel coordinate at which to rotate the image.
- /// The vertical pixel coordinate at which to rotate the image.
- /// The angle in degrees at which to rotate the image.
- /// The image rotated to the given angle at the given position.
- ///
+ /// The rotation layer.
+ ///
/// Based on the Rotate effect
///
- private Bitmap RotateImage(Image image, float rotateAtX, float rotateAtY, RotateInsideLayer rotateLayer)
+ /// The image rotated to the given angle at the given position.
+ private Bitmap RotateImage(Image image, RotateInsideLayer rotateLayer)
{
- // Create a new empty bitmap to hold rotated image
- Bitmap newImage = new Bitmap(image.Width, image.Height);
- newImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
+ Size newSize = new Size(image.Width, image.Height);
float zoom = Imaging.Rotation.ZoomAfterRotation(image.Width, image.Height, rotateLayer.Angle);
+ // if we don't keep the image dimensions, calculate the new ones
+ if (!rotateLayer.KeepImageDimensions)
+ {
+ newSize.Width = (int)(newSize.Width / zoom);
+ newSize.Height = (int)(newSize.Height / zoom);
+ }
+
+ // Center of the image
+ float rotateAtX = Math.Abs(image.Width / 2);
+ float rotateAtY = Math.Abs(image.Height / 2);
+
+ // Create a new empty bitmap to hold rotated image
+ Bitmap newImage = new Bitmap(newSize.Width, newSize.Height);
+ newImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
+
// Make a graphics object from the empty bitmap
using (Graphics graphics = Graphics.FromImage(newImage))
{
@@ -103,20 +110,41 @@ namespace ImageProcessor.Processors
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.CompositingQuality = CompositingQuality.HighQuality;
- // Put the rotation point in the "center" of the image
- graphics.TranslateTransform(rotateAtX, rotateAtY);
+ if (rotateLayer.KeepImageDimensions)
+ {
+ // Put the rotation point in the "center" of the image
+ graphics.TranslateTransform(rotateAtX, rotateAtY);
+
+ // Rotate the image
+ graphics.RotateTransform(rotateLayer.Angle);
+
+ // Zooms the image to fit the area
+ graphics.ScaleTransform(zoom, zoom);
- // Rotate the image
- graphics.RotateTransform(rotateLayer.Angle);
+ // Move the image back
+ graphics.TranslateTransform(-rotateAtX, -rotateAtY);
- // Zooms the image to fit the area
- graphics.ScaleTransform(zoom, zoom);
+ // Draw passed in image onto graphics object
+ graphics.DrawImage(image, new PointF(0, 0));
+ }
+ else
+ {
+ // calculate the difference between the center of the original image and the center of the new image
+ int diffX = (image.Width - newSize.Width) / 2;
+ int diffY = (image.Height - newSize.Height) / 2;
+
+ // Put the rotation point in the "center" of the old image
+ graphics.TranslateTransform(diffX, diffY);
- // Move the image back
- graphics.TranslateTransform(-rotateAtX * 2, -rotateAtY * 2);
+ // Rotate the image
+ graphics.RotateTransform(rotateLayer.Angle);
- // Draw passed in image onto graphics object
- graphics.DrawImage(image, new PointF(rotateAtX, rotateAtY));
+ // Move the image back
+ graphics.TranslateTransform(-diffX * 2, -diffY * 2);
+
+ // Draw passed in image onto graphics object
+ graphics.DrawImage(image, new PointF(0, 0));
+ }
}
return newImage;