Questa domanda sembra essere stata messa a tacere, ma nella mia ricerca di una soluzione che potrei comprendere più facilmente (e scritta in Swift), sono arrivato a questo (pubblicato anche su: Come ritagliare l'UIImage? )
Volevo essere in grado di ritagliare da una regione in base a un rapporto proporzioni e ridimensionare a una dimensione in base a un limite esterno. Ecco la mia variazione:
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
}
}
Ci sono un paio di cose che ho trovato confuse, le preoccupazioni separate di ritaglio e ridimensionamento. Il ritaglio viene gestito con l'origine del rettangolo che si passa a drawInRect e il ridimensionamento viene gestito dalla porzione di dimensione. Nel mio caso, avevo bisogno di mettere in relazione le dimensioni del rettangolo di ritaglio sulla sorgente, con il mio rettangolo di output dello stesso formato. Il fattore di scala viene quindi emesso / immesso e questo deve essere applicato a drawRect (passato a drawInRect).
Un avvertimento è che questo approccio presuppone effettivamente che l'immagine che stai disegnando sia più grande del contesto dell'immagine. Non l'ho provato, ma penso che tu possa usare questo codice per gestire il ritaglio / zoom, ma definendo esplicitamente il parametro di scala come parametro di scala sopra menzionato. Per impostazione predefinita, UIKit applica un moltiplicatore basato sulla risoluzione dello schermo.
Infine, va notato che questo approccio UIKit è di livello superiore rispetto agli approcci CoreGraphics / Quartz e Core Image e sembra gestire i problemi di orientamento delle immagini. Vale anche la pena ricordare che è abbastanza veloce, secondo ImageIO, secondo questo post qui: http://nshipster.com/image-resizing/