Этот вопрос, кажется, был решен, но в моем поиске решения, которое мне было бы легче понять (и написанного на 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 и Core Image, и, похоже, решает проблемы ориентации изображения. Также стоит отметить, что он довольно быстр, уступая ImageIO, согласно этому сообщению здесь: http://nshipster.com/image-resizing/
person
Chris Conover
schedule
28.05.2015