Этот вопрос , кажется, был поставлен на отдых, но в моих поисках решения , которое я мог бы более легко понять (и написано в Swift), я приехал на это (также размещена на: Как обрезать UIImage )
Я хотел, чтобы иметь возможность обрезать из области на основе соотношения сторон, и масштаб до размера на основе внешней ограничивающей степени. Вот мой вариант:
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
}
}
Есть несколько вещей, которые я нашел в заблуждении, отдельные заботы кадрирования и изменения размера. Обрезка обрабатываются с началом прямоугольника, который вы передаете в drawInRect и масштабирование осуществляется с помощью блока размера. В моем случае, мне нужно, чтобы связать размера обрезанного прямоугольника на источнике, на мой выходной прямоугольника той же пропорции. Масштабный коэффициент, то выход / вход, и это должно быть применено к DrawRect (передается drawInRect).
Одно предостережение в том, что этот подход фактически предполагает, что изображение, которое вы рисуете больше контекста изображения. Я не проверял, но я думаю, что вы можете использовать этот код для обработки кадрирования / масштабирования, но явно определяющего параметр масштабирования, чтобы быть выше параметром масштаба. По умолчанию, UIKit применяет множитель на основе разрешения экрана.
Наконец, следует отметить , что этот UIKit подход более высокий уровень , чем CoreGraphics / Quartz и Основных подходов изображения, и , кажется, решать вопросы ориентации изображения. Стоит также отметить , что это довольно быстро, второй в ImageIO, согласно этому сообщению здесь: http://nshipster.com/image-resizing/