2015-01-23 00:02:08 +00:00
|
|
|
/// A `UIImage` extension that makes it easier to resize the image and inspect its size.
|
|
|
|
|
2014-12-12 20:29:17 +00:00
|
|
|
extension UIImage {
|
2015-01-23 00:02:08 +00:00
|
|
|
/// Resizes an image instance.
|
|
|
|
///
|
|
|
|
/// :param: size The new size of the image.
|
|
|
|
/// :returns: A new resized image instance.
|
2014-12-12 20:29:17 +00:00
|
|
|
func resize(size: CGSize) -> UIImage {
|
2015-04-23 22:30:57 +00:00
|
|
|
UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
|
|
|
|
self.drawInRect(CGRect(origin: CGPointZero, size: size))
|
2014-12-12 20:29:17 +00:00
|
|
|
let newImage = UIGraphicsGetImageFromCurrentImageContext()
|
|
|
|
UIGraphicsEndImageContext()
|
|
|
|
return newImage
|
|
|
|
}
|
|
|
|
|
2015-04-23 22:30:57 +00:00
|
|
|
/// Resizes an image instance to fit inside a constraining size while keeping the aspect ratio.
|
|
|
|
///
|
|
|
|
/// :param: size The constraining size of the image.
|
|
|
|
/// :returns: A new resized image instance.
|
|
|
|
func resizeAspectFit(size: CGSize) -> UIImage {
|
|
|
|
let newSize = self.size.sizeConstrainedBySize(size)
|
|
|
|
return resize(newSize)
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Resizes an image instance to fill a constraining size while keeping the aspect ratio.
|
|
|
|
///
|
|
|
|
/// :param: size The constraining size of the image.
|
|
|
|
/// :returns: A new resized image instance.
|
|
|
|
func resizeAspectFill(size: CGSize) -> UIImage {
|
|
|
|
let newSize = self.size.sizeFillingSize(size)
|
|
|
|
return resize(newSize)
|
|
|
|
}
|
|
|
|
|
2015-01-23 00:02:08 +00:00
|
|
|
/// Returns a new `UIImage` instance using raw image data and a size.
|
|
|
|
///
|
|
|
|
/// :param: data Raw image data.
|
|
|
|
/// :param: size The size to be used to resize the new image instance.
|
|
|
|
/// :returns: A new image instance from the passed in data.
|
2014-12-12 20:29:17 +00:00
|
|
|
class func imageWithData(data: NSData, size: CGSize) -> UIImage? {
|
|
|
|
return UIImage(data: data)?.resize(size)
|
|
|
|
}
|
2014-12-12 21:49:22 +00:00
|
|
|
|
2015-01-23 00:02:08 +00:00
|
|
|
/// Returns an image size from raw image data.
|
|
|
|
///
|
|
|
|
/// :param: data Raw image data.
|
|
|
|
/// :returns: The size of the image contained in the data.
|
2014-12-12 20:29:17 +00:00
|
|
|
class func sizeForImageData(data: NSData) -> CGSize? {
|
|
|
|
return UIImage(data: data)?.size
|
|
|
|
}
|
|
|
|
}
|
2015-04-23 22:15:19 +00:00
|
|
|
|
|
|
|
private extension CGSize {
|
2015-04-23 22:55:40 +00:00
|
|
|
/// Calculates the aspect ratio of the size.
|
|
|
|
///
|
|
|
|
/// :returns: aspectRatio The aspect ratio of the size.
|
|
|
|
var aspectRatio: CGFloat {
|
|
|
|
if height == 0 { return 1 }
|
|
|
|
return width / height
|
|
|
|
}
|
|
|
|
|
2015-04-23 22:15:19 +00:00
|
|
|
/// Finds a new size constrained by a size keeping the aspect ratio.
|
|
|
|
///
|
|
|
|
/// :param: size The contraining size.
|
|
|
|
/// :returns: size A new size that fits inside the contraining size with the same aspect ratio.
|
|
|
|
func sizeConstrainedBySize(size: CGSize) -> CGSize {
|
|
|
|
let aspectWidth = round(aspectRatio * size.height)
|
|
|
|
let aspectHeight = round(size.width / aspectRatio)
|
|
|
|
|
|
|
|
if aspectWidth > size.width {
|
|
|
|
return CGSize(width: size.width, height: aspectHeight)
|
|
|
|
} else {
|
|
|
|
return CGSize(width: aspectWidth, height: size.height)
|
|
|
|
}
|
|
|
|
}
|
2015-04-23 22:30:57 +00:00
|
|
|
|
|
|
|
/// Finds a new size filling the given size while keeping the aspect ratio.
|
|
|
|
///
|
|
|
|
/// :param: size The contraining size.
|
|
|
|
/// :returns: size A new size that fills the contraining size keeping the same aspect ratio.
|
|
|
|
func sizeFillingSize(size: CGSize) -> CGSize {
|
|
|
|
let aspectWidth = round(aspectRatio * size.height)
|
|
|
|
let aspectHeight = round(size.width / aspectRatio)
|
|
|
|
|
|
|
|
if aspectWidth > size.width {
|
|
|
|
return CGSize(width: aspectWidth, height: size.height)
|
|
|
|
} else {
|
|
|
|
return CGSize(width: size.width, height: aspectHeight)
|
|
|
|
}
|
|
|
|
}
|
2015-04-23 22:15:19 +00:00
|
|
|
}
|