Cette question semble avoir été mis au repos, mais dans ma quête d'une solution que je puisse comprendre plus facilement (et écrit à Swift), je suis arrivé à ce (également affiché à: ? Comment recadrer la UIImage )
Je veux être en mesure de découper à partir d'une région basée sur un rapport d'aspect, et l'échelle à une taille basée sur une mesure de délimitation extérieure. Voici ma variation:
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
}
}
Il y a quelques choses que je trouve confus, les préoccupations distinctes de culture et le redimensionnement. Recadrage est manipulé avec l'origine du rect que vous passez à drawInRect, et mise à l'échelle est gérée par la partie de taille. Dans mon cas, je devais rapporter la taille de la culture rect sur la source, à mon rect de sortie du même rapport d'aspect. Le facteur d'échelle est alors sortie / entrée, et cela doit être appliqué à la drawRect (passé à drawInRect).
Une mise en garde est que cette approche suppose effectivement que l'image que vous dessinez est plus grand que le contexte de l'image. Je ne l'ai pas testé, mais je pense que vous pouvez utiliser ce code pour gérer le recadrage / zoom, mais définir explicitement le paramètre d'échelle pour le paramètre d'échelle mentionnée ci-dessus. Par défaut, UIKit applique un multiplicateur en fonction de la résolution de l'écran.
Enfin, il convient de noter que cette approche UIKit est plus haut que CoreGraphics / quartz et des approches de l' image de base, et semble traiter les questions d'orientation de l' image. Il est également à noter qu'il est assez rapide, deuxième à ImageIO, selon ce poste ici: http://nshipster.com/image-resizing/