-
-
Save HamptonMakes/180e81cd961573e3c54d to your computer and use it in GitHub Desktop.
// | |
// RBResizer.swift | |
// Locker | |
// | |
// Created by Hampton Catlin on 6/20/14. | |
// Copyright (c) 2014 rarebit. All rights reserved. | |
// | |
import UIKit | |
func RBSquareImageTo(image: UIImage, size: CGSize) -> UIImage { | |
return RBResizeImage(RBSquareImage(image), size) | |
} | |
func RBSquareImage(image: UIImage) -> UIImage { | |
var originalWidth = image.size.width | |
var originalHeight = image.size.height | |
var edge: CGFloat | |
if originalWidth > originalHeight { | |
edge = originalHeight | |
} else { | |
edge = originalWidth | |
} | |
var posX = (originalWidth - edge) / 2.0 | |
var posY = (originalHeight - edge) / 2.0 | |
var cropSquare = CGRectMake(posX, posY, edge, edge) | |
var imageRef = CGImageCreateWithImageInRect(image.CGImage, cropSquare); | |
return UIImage(CGImage: imageRef, scale: UIScreen.mainScreen().scale, orientation: image.imageOrientation) | |
} | |
func RBResizeImage(image: UIImage, targetSize: CGSize) -> UIImage { | |
let size = image.size | |
let widthRatio = targetSize.width / image.size.width | |
let heightRatio = targetSize.height / image.size.height | |
// Figure out what our orientation is, and use that to form the rectangle | |
var newSize: CGSize | |
if(widthRatio > heightRatio) { | |
newSize = CGSizeMake(size.width * heightRatio, size.height * heightRatio) | |
} else { | |
newSize = CGSizeMake(size.width * widthRatio, size.height * widthRatio) | |
} | |
// This is the rect that we've calculated out and this is what is actually used below | |
let rect = CGRectMake(0, 0, newSize.width, newSize.height) | |
// Actually do the resizing to the rect using the ImageContext stuff | |
UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0) | |
image.drawInRect(rect) | |
let newImage = UIGraphicsGetImageFromCurrentImageContext() | |
UIGraphicsEndImageContext() | |
return newImage | |
} |
Simple and fantastic! Thank you very much!
nice gist! I've updated it to work with xcode 6.1.1.
https://gist.github.com/westerlund/9e357a50315a7d9fe419
Great work !
I don't know why it doesn't work for me. Example: my origin image size is 480x640, so cropSquare is 480x480, but instead of getting same size for imageRef, I'm getting 480x400, and then function is returning "img" with size 200x240 (?!). But if I use 0 instead of posY in CGRectMake (posX, 0, edge, edge) everything is fine (returning image size is 480x480), but the image is not centered but is cropped from the top, of course. Can someone help me?
I had the same problem as Vlad - after some research I think it has to do with the image orientation always being portrait in the CGImage ... I edited the code in the RBSquareImage function to remove the "edge" variable usage as well as the "posX" and "posY" variables and then changed the "cropSquare" calculation to this "var cropSquare = CGRectMake((originalHeight - originalWidth)/2, 0.0, originalWidth, originalWidth)" and then it worked in both portrait and landscape configuration and that function would return me a square image cropped in the middle. Cheers and I hope this helps.
This is so useful! thank you!
This is super helpful and saved me a lot of time. Thanks for sharing!
You should change this:
UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0)
to this:
UIGraphicsBeginImageContextWithOptions(newSize, false, UIScreen.mainScreen().scale)
for the best quality on iPhone 6+
Thank you ! :)
Awesome! Thank you! 😄
Thanks to the original author and thanks to @bashome for the fix. Really works now.
Updated for Swift 2.0:
https://gist.github.com/iroller/390f4e20736db3bc39a0
thanks for you help me!
Thanks for posting this. Don't know why UIKit doesn't have a method for this.
Updated for use as a UIImage Extension
https://gist.github.com/justinlevi/ee037a4bb63598f6e56f
How do I implement this into my app?
Very useful! Awesome!
Thank you
Awesome, very useful contribution.