這個問題似乎已經被解決了,但是當我尋求一個我可以更容易理解(並且用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