Skip to content

Instantly share code, notes, and snippets.

@jkereako
Last active September 18, 2021 04:01
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jkereako/200342b66b5416fd715a to your computer and use it in GitHub Desktop.
Save jkereako/200342b66b5416fd715a to your computer and use it in GitHub Desktop.
// credit: http://stackoverflow.com/questions/603907/uiimage-resize-then-crop#605385
func scaleAndCropImage(_ image:UIImage, toSize size: CGSize) -> UIImage {
// Make sure the image isn't already sized.
guard !image.size.equalTo(size) else {
return image
}
let widthFactor = size.width / image.size.width
let heightFactor = size.height / image.size.height
var scaleFactor: CGFloat = 0.0
scaleFactor = heightFactor
if widthFactor > heightFactor {
scaleFactor = widthFactor
}
var thumbnailOrigin = CGPoint.zero
let scaledWidth = image.size.width * scaleFactor
let scaledHeight = image.size.height * scaleFactor
if widthFactor > heightFactor {
thumbnailOrigin.y = (size.height - scaledHeight) / 2.0
}
else if widthFactor < heightFactor {
thumbnailOrigin.x = (size.width - scaledWidth) / 2.0
}
var thumbnailRect = CGRect.zero
thumbnailRect.origin = thumbnailOrigin
thumbnailRect.size.width = scaledWidth
thumbnailRect.size.height = scaledHeight
// Why use `UIGraphicsBeginImageContextWithOptions` over `UIGraphicsBeginImageContext`?
// see: http://stackoverflow.com/questions/4334233/how-to-capture-uiview-to-uiimage-without-loss-of-quality-on-retina-display#4334902
UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
image.draw(in: thumbnailRect)
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return scaledImage
}
@jkereako
Copy link
Author

Description

This resizes and then crops an image to fit within a specified rect.

The image is drawn off-screen in a buffer, that is done with UIGraphicsBeginImageContextWithOptions. See the Drawing and Printing Guide for iOS

Performance

Although this is the most efficient way to resize an image it still is an expensive procedure, hence, it ought to be run a few times as possible. Execute this routine on a background thread and then cache the result.

@sasanBaho
Copy link

Thanks man! it solved my big problem!

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