Last active
November 13, 2018 08:17
-
-
Save nicwise/890460 to your computer and use it in GitHub Desktop.
Scale and Rotate an image in iOS / MonoTouch, using the EXIF data
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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; | |
} |
It worked like a charm ! Thank you !
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!
This works very good! I wonder if there is a version for Monodroid aswell?
Thanks.
What is the maxSize parameter for no changing photo's resolution ?
Thanks! This helped me a ton.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I was building the same thing but got problems with Orientation. Your Snipped works perfectly. Thanks a bunch!