Dette spørsmålet synes å ha blitt satt til hvile, men i min søken etter en løsning som jeg kunne lettere forstå (og skrevet i Swift), jeg kom til dette (også lagt til: ? Hvordan beskjære UIImage )
I ville være i stand til å skjære fra et område basert på et sideforhold, og skala til en størrelse basert på en ytre avgrensende grad. Her er min variant:
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
}
}
Det er et par ting som jeg fant forvirrende, de separate bekymringene til beskjæring og endre størrelse. Beskjæring håndteres med opprinnelsen til rect som du sender til drawInRect, og skalering håndteres av størrelse delen. I mitt tilfelle, jeg trengte å forholde størrelsen på beskjæring rect på kilden, til min utgang rect av samme størrelsesforhold. Skaleringsfaktoren er da utgang / inngang, og dette må brukes til drawRect (passert til drawInRect).
En påminnelse er at denne tilnærmingen effektivt forutsetter at bildet du tegner er større enn bildet sammenheng. Jeg har ikke testet dette, men jeg tror du kan bruke denne koden for å håndtere beskjæring / zooming, men eksplisitt definere omfanget parameter for å være den nevnte skalaen parameter. Som standard gjelder UIKit en multiplikator basert på skjermoppløsningen.
Til slutt bør det nevnes at dette UIKit tilnærmingen er høyere nivå enn Coregraphics / Quartz og Core Image nærmer seg, og ser ut til å håndtere bildeorienteringsproblemer. Det er også verdt å nevne at det er ganske fort, andre til ImageIOs, i henhold til dette innlegget her: http://nshipster.com/image-resizing/