Skip to content

Instantly share code, notes, and snippets.

@nicwise
Last active November 13, 2018 08:17
Show Gist options
  • Select an option

  • Save nicwise/890460 to your computer and use it in GitHub Desktop.

Select an option

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

mjracca commented Jun 3, 2013

Copy link
Copy Markdown

Thanks!! Rotation works perfectly!

@tonyfonager

Copy link
Copy Markdown

You are the champ - thanks ;-)

@schmidan

schmidan commented Dec 6, 2013

Copy link
Copy Markdown

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

@adilo

adilo commented Dec 25, 2013

Copy link
Copy Markdown

It worked like a charm ! Thank you !

@felixcollins

Copy link
Copy Markdown

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
Copy Markdown

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

@yehe01

yehe01 commented Aug 26, 2016

Copy link
Copy Markdown

Thanks.

@armaganX

Copy link
Copy Markdown

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

@drew-neely

drew-neely commented Jun 18, 2018

Copy link
Copy Markdown

Thanks! This helped me a ton.

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