这个问题似乎已经被解决了,但是当我寻求一个我可以更容易理解(并且用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)。
一个警告是,这种方法有效地假定你正在绘制的图像大于图像上下文。我没有测试过这个,但我认为你可以使用这段代码来处理裁剪/缩放,但是明确地将scale参数定义为前述的比例参数。默认情况下,UIKit会根据屏幕分辨率应用一个乘数。
最后,应该指出的是,这种UIKit方法比CoreGraphics/Quartz和Core Image方法更高级,并且似乎可以处理图像方向问题。这也是值得一提的是,它是相当快的,第二ImageIO,根据这个职位在这里:http://nshipster.com/image-resizing/
的链接断开,以你的形象。 – 2012-09-12 09:58:44
有一件事,如果我们感到震惊的是为什么苹果没有把它添加到UIImagePickerController - 它太沉闷的困难;-) – Tim 2015-03-15 12:23:16