Esta cuestión parece haber sido puesto a descansar, pero en mi búsqueda de una solución que pude entender más fácilmente (y escrito en Swift), que llegó a esta (también publicado a: ? Cómo recortar el UIImage )
Quería ser capaz de recortar de una región sobre la base de una relación de aspecto, y la escala a un tamaño sobre la base de una medida de delimitación exterior. Aquí está mi variación:
import AVFoundation
import ImageIO
class Image {
class func crop(image:UIImage, crop source:CGRect, aspect:CGSize, outputExtent:CGSize) -> UIImage {
let sourceRect = AVMakeRectWithAspectRatioInsideRect(aspect, source)
let targetRect = AVMakeRectWithAspectRatioInsideRect(aspect, CGRect(origin: CGPointZero, size: outputExtent))
let opaque = true, deviceScale:CGFloat = 0.0 // use scale of device's main screen
UIGraphicsBeginImageContextWithOptions(targetRect.size, opaque, deviceScale)
let scale = max(
targetRect.size.width / sourceRect.size.width,
targetRect.size.height / sourceRect.size.height)
let drawRect = CGRect(origin: -sourceRect.origin * scale, size: image.size * scale)
image.drawInRect(drawRect)
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return scaledImage
}
}
Hay un par de cosas que me pareció confuso, las preocupaciones separadas de cortar y redimensionar. El recorte se maneja con el origen de la rect que se pasa a drawInRect y escalado es manejado por el tamaño de la porción. En mi caso, tenía que relacionar el tamaño del recorte rect de la fuente, a mi rect salida de la misma relación de aspecto. El factor de escala es entonces de salida / entrada, y esto debe ser aplicado a la drawRect (pasado a drawInRect).
Una advertencia es que este enfoque supone efectivamente que la imagen que se está dibujando es más grande que el marco de imagen. No he probado esto, pero creo que se puede utilizar este código para manejar los cultivos / zoom, pero definiendo explícitamente el parámetro de escala a ser el parámetro de escala antes mencionada. Por defecto, UIKit aplica un multiplicador basado en la resolución de la pantalla.
Por último, cabe señalar que este enfoque es UIKit nivel más alto que CoreGraphics / cuarzo y enfoques Core Image, y parece manejar cuestiones de orientación de la imagen. También vale la pena mencionar que es bastante rápido, en segundo lugar a ImageIO, de acuerdo con este post aquí: http://nshipster.com/image-resizing/