Această întrebare pare să fi fost pus să se odihnească, dar în căutarea mea pentru o soluție pe care am putut înțelege mai ușor (și scris în Swift), am ajuns la acest lucru ( de asemenea , să: Cum pentru a decupa UIImage )
Am vrut să fie în măsură să decupa dintr-o regiune bazată pe un raport de aspect și scara la o dimensiune bazată pe o măsură de delimitare exterioară. Aici este variația mea:
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
}
}
Există câteva lucruri pe care le-am găsit confuz, preocupările separate de trunchiere și de redimensionare. Decuparea este manipulat cu originea pe care treci rect la drawInRect, și scalarea este tratată de către porțiunea de mărime. În cazul meu, am avut nevoie să se refere dimensiunea decupării de pe rect sursa, pentru a-mi RECT de ieșire din același raport de aspect. Factorul de scalare este apoi ieșire / intrare, iar acest lucru trebuie să fie aplicată pe drawRect (trecut la drawInRect).
O precizare este că această abordare presupune în mod eficient că imaginea pe care o desenați este mai mare decât contextul imaginii. Nu am testat acest lucru, dar cred că puteți utiliza acest cod să se ocupe de trunchiere / zoom, dar care definește în mod explicit parametrul scară pentru a fi parametrul de scară menționat mai sus. În mod implicit, UIKit se aplică un factor de multiplicare bazat pe rezoluția ecranului.
În cele din urmă, trebuie remarcat faptul că această abordare este UIKit nivel mai mare decât CoreGraphics / cuarț și abordări Core fotografie, și pare să se ocupe de probleme de orientare a imaginii. De asemenea , este demn de menționat faptul că este destul de rapid, în al doilea rând la ImageIO, în conformitate cu acest post aici: http://nshipster.com/image-resizing/