这个问题似乎已经解决了,但是在我寻求一个更容易理解(用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)。
需要注意的是,这种方法有效地假设您所绘制的图像大于图像上下文。我尚未对此进行测试,但是我认为您可以使用此代码来处理裁剪/缩放,但是可以将scale参数明确定义为上述的scale参数。默认情况下,UIKit根据屏幕分辨率应用乘数。
最后,应该注意的是,这种UIKit方法比CoreGraphics / Quartz和Core Image方法的级别更高,并且似乎可以处理图像方向问题。值得一提的是,它的速度非常快,仅次于ImageIO,根据此处的帖子:http : //nshipster.com/image-resizing/