Skip to content

Instantly share code, notes, and snippets.

@nicwise
Last active November 13, 2018 08:17
Show Gist options
  • Star 19 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save nicwise/890460 to your computer and use it in GitHub Desktop.
Save nicwise/890460 to your computer and use it in GitHub Desktop.
Scale and Rotate an image in iOS / MonoTouch, using the EXIF data
//MIT license
public static UIImage ScaleImage(UIImage image, int maxSize)
{
UIImage res;
using (CGImage imageRef = image.CGImage)
{
CGImageAlphaInfo alphaInfo = imageRef.AlphaInfo;
CGColorSpace colorSpaceInfo = CGColorSpace.CreateDeviceRGB();
if (alphaInfo == CGImageAlphaInfo.None)
{
alphaInfo = CGImageAlphaInfo.NoneSkipLast;
}
int width, height;
width = imageRef.Width;
height = imageRef.Height;
if (height >= width)
{
width = (int)Math.Floor((double)width * ((double)maxSize / (double)height));
height = maxSize;
}
else
{
height = (int)Math.Floor((double)height * ((double)maxSize / (double)width));
width = maxSize;
}
CGBitmapContext bitmap;
if (image.Orientation == UIImageOrientation.Up || image.Orientation == UIImageOrientation.Down)
{
bitmap = new CGBitmapContext(IntPtr.Zero, width, height, imageRef.BitsPerComponent, imageRef.BytesPerRow, colorSpaceInfo, alphaInfo);
}
else
{
bitmap = new CGBitmapContext(IntPtr.Zero, height, width, imageRef.BitsPerComponent, imageRef.BytesPerRow, colorSpaceInfo, alphaInfo);
}
switch (image.Orientation)
{
case UIImageOrientation.Left:
bitmap.RotateCTM((float)Math.PI / 2);
bitmap.TranslateCTM(0, -height);
break;
case UIImageOrientation.Right:
bitmap.RotateCTM(-((float)Math.PI / 2));
bitmap.TranslateCTM(-width, 0);
break;
case UIImageOrientation.Up:
break;
case UIImageOrientation.Down:
bitmap.TranslateCTM(width, height);
bitmap.RotateCTM(-(float)Math.PI);
break;
}
bitmap.DrawImage(new Rectangle(0, 0, width, height), imageRef);
res = UIImage.FromImage(bitmap.ToImage());
bitmap = null;
}
return res;
}
@mjracca
Copy link

mjracca commented Jun 3, 2013

Thanks!! Rotation works perfectly!

@tonyfonager
Copy link

You are the champ - thanks ;-)

@schmidan
Copy link

schmidan commented Dec 6, 2013

I was building the same thing but got problems with Orientation. Your Snipped works perfectly. Thanks a bunch!

@adilo
Copy link

adilo commented Dec 25, 2013

It worked like a charm ! Thank you !

@felixcollins
Copy link

Note that the BytesPerRow is not being recalculated for the CGBitmapContext ctor despite scaling the size. This can cause an exception if the row width is not great enough ("CGBitmapContextCreate: invalid data bytes/row:"). Set it to 0 instead of imageRef.BytesPerRow to let CoreGraphics calculate it. Thanks Mr Wise!

@jacksierkstra
Copy link

This works very good! I wonder if there is a version for Monodroid aswell?

@yehe01
Copy link

yehe01 commented Aug 26, 2016

Thanks.

@armaganX
Copy link

What is the maxSize parameter for no changing photo's resolution ?

@drew-neely
Copy link

drew-neely commented Jun 18, 2018

Thanks! This helped me a ton.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment