Questa domanda sembra essere stato messo a riposo, ma nella mia ricerca di una soluzione che ho potuto comprendere più facilmente (e scritto in Swift), sono arrivato a questo (anche scritto a: ? Come ritagliare l'UIImage )
Volevo essere in grado di tagliare da una regione sulla base di un rapporto di aspetto, e la scala ad una dimensione basata su una delimitazione esterna misura. Ecco la mia variante:
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 confuso, le preoccupazioni separate di ritaglio e il ridimensionamento. Il ritaglio viene gestita con l'origine del rect che si passa a drawInRect, e il ridimensionamento è gestito dalla porzione dimensioni. Nel mio caso, avevo bisogno di mettere in relazione le dimensioni del rettangolo ritaglio sulla fonte, a mia uscita rect dello stesso rapporto. Il fattore di scala è quindi uscita / ingresso, e questo deve essere applicato al drawRect (passato a drawInRect).
Un avvertimento è che questo approccio presuppone in modo efficace che l'immagine che si sta disegnando è più grande del contesto dell'immagine. Non ho ancora testato questo, ma penso che è possibile utilizzare questo codice per gestire ritaglio / zoom, ma definisce in modo esplicito il parametro di scala per essere il parametro di scala di cui sopra. Per impostazione predefinita, UIKit applica un moltiplicatore in base alla risoluzione dello schermo.
Infine, va notato che questo approccio è UIKit livello più alto rispetto CoreGraphics / quarzo e approcci Core Image, e sembra gestire i problemi di orientamento delle immagini. Vale anche la pena ricordare che è abbastanza veloce, secondo a ImageIO, secondo questo post qui: http://nshipster.com/image-resizing/