이 질문은 중단 된 것처럼 보이지만 더 쉽게 이해할 수 있고 (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에 전달한 사각형의 원점으로 처리되며 크기 부분에 따라 크기 조정이 처리됩니다. 필자의 경우 소스의 자르기 rect 크기를 동일한 종횡비의 출력 rect와 관련시켜야했습니다. 그런 다음 스케일 팩터가 출력 / 입력되며 drawRect (drawInRect로 전달)에 적용되어야합니다.
한 가지주의 할 점은이 방법은 사용자가 그리는 이미지가 이미지 컨텍스트보다 크다고 효과적으로 가정한다는 것입니다. 나는 이것을 테스트하지는 않았지만이 코드를 사용하여 자르기 / 줌을 처리 할 수 있지만 스케일 매개 변수를 위에서 언급 한 스케일 매개 변수로 명시 적으로 정의 할 수 있다고 생각합니다. 기본적으로 UIKit은 화면 해상도에 따라 승수를 적용합니다.
마지막으로이 UIKit 방식은 CoreGraphics / Quartz 및 Core Image 방식보다 높은 수준이며 이미지 방향 문제를 처리하는 것으로 보입니다. 이 게시물에 따르면 http://nshipster.com/image-resizing/ 에 따르면 ImageIO 다음으로 꽤 빠르다는 점도 언급 할 가치가 있습니다.