Diese Frage scheint zur Ruhe sein setzen, aber in meiner Suche nach einer Lösung , die ich leichter verstehen konnte (und in Swift geschrieben), dass ich in diesem angekommen (auch gebucht: ? Wie wird die UIImage zu beschneiden )
Ich wollte in der Lage sein, von einem Bereich auf einem Seitenverhältnis basierend zuschneiden und skalieren bis zu einer Größe auf einem äußeren Begrenzungs Ausmaß basiert. Hier ist meine 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
}
}
Es gibt ein paar Dinge, die ich gefunden verwirrend, die einzelnen Anliegen Beschneiden und Skalieren. Cropping mit dem Ursprung des rect behandelt, die Sie drawInRect passieren, und die Skalierung durch die Größe Abschnitt behandelt wird. In meinem Fall musste ich die Größe der Anbau chtung der Quelle beziehen, zu meiner Ausgabe rect des gleichen Seitenverhältnisses. Der Skalierungsfaktor wird dann ausgegeben / eingegeben wird, und dies muss auf die drawRect angewendet werden (übergeben drawInRect).
Ein Nachteil ist, dass dieser Ansatz setzt voraus, effektiv, dass das Bild, das Sie zeichnen größer ist als der Bildkontext. Ich habe nicht getestet, aber ich denke, Sie diesen Code verwenden können, um Griff Zuschneiden / Zoomen, sondern explizit die Definition der Skalenparameter der zuvor erwähnte Skalenparameter zu sein. Standardmäßig gilt UIKit einen Multiplikator auf der Grundlage der Bildschirmauflösung.
Schließlich sei darauf hingewiesen, dass dieser UIKit Ansatz ist höher als Core Graphics / Quartz und Core Image Ansätze und scheint Probleme Bildorientierung zu behandeln. Es ist auch erwähnenswert , dass es ziemlich schnell, an zweiter Stelle zu ImageIO ist, nach diesem Beitrag hier: http://nshipster.com/image-resizing/