Этот вопрос, похоже, успокоился, но в моем стремлении к решению, которое я мог бы более легко понять (и написано в Swift), я достиг этого (также опубликовано: How to crop the 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 и Core Image, и, похоже, справляется с проблемами ориентации изображения. Также стоит упомянуть, что он довольно быстрый, второй по сравнению с ImageIO, в соответствии с этим постом здесь: http://nshipster.com/image-resizing/
Ссылка сломана к изображению. – 2012-09-12 09:58:44
Одна вещь, если нас не шокирует, почему Apple не добавила ее в UIImagePickerController - ее слишком штопает сложно ;-) – Tim