Deze vraag lijkt te zijn om te rusten te zetten, maar in mijn zoektocht naar een oplossing die ik kon gemakkelijker te begrijpen (en geschreven in Swift), kwam ik op dit (ook geplaatst op: ? Hoe de UIImage bijsnijden )
Ik wil kunnen snijden uit een gebied op basis van een aspectverhouding en schaal een afmeting gebaseerd op een buitenzijde begrenzende mate. Hier is mijn variatie:
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
}
}
Er zijn een paar dingen die ik vond verwarrend, de afzonderlijke belangen van bijsnijden en vergroten of verkleinen. Bijsnijden wordt behandeld met de oorsprong van de rect die u doorgeeft aan drawInRect, en de schaalvergroting wordt afgehandeld door de portiegrootte. In mijn geval, ik nodig had om de grootte van de uitsnede rect op de bron relateren, mijn uitgang rect van hetzelfde aspect ratio. De schaalfactor wordt dan uitgang / ingang, en dit moet worden toegepast op de drawRect (doorgegeven aan drawInRect).
Een nadeel is dat deze aanpak effectief gaat ervan uit dat de afbeelding die u aan het tekenen is groter dan het beeld context. Ik heb dit niet getest, maar ik denk dat je kunt deze code gebruiken om te behandelen bijsnijden / zoomen, maar expliciet definiëren van de parameter schaal om de hiervoor genoemde schaal parameter. Standaard UIKit geldt een multiplier op basis van de schermresolutie.
Tot slot dient te worden opgemerkt dat deze UIKit aanpak is hoger niveau dan CoreGraphics / Quartz en Core Image benaderingen, en lijkt beeldoriëntatie kwesties te behandelen. Het is ook het vermelden waard dat het vrij snel, tweede tot en ImageIO, volgens deze post hier: http://nshipster.com/image-resizing/