我正在使用 PhotoKit 并实现了过滤器,用户可以将其应用于照片库中的照片。我目前正在获取图像,应用过滤器,将编辑后的版本返回为CIImage
,然后将其转换CIImage
为NSData
using UIImageJPEGRepresentation
,以便将其写入磁盘。虽然这很有效,但当用户尝试编辑非常大(如 30 MB)的照片时,可能需要 30 秒以上的时间才能完成,其中 98% 的时间都花在了UIImageJPEGRepresentation
(从 Instruments 获得的统计数据)上。
如果可能的话,我正在寻找一种更有效的方法来将这张编辑过的照片保存到磁盘而不影响质量。
我知道UIImagePNGRepresentation
可能会提高质量,但这甚至比 JPEG 表示还要慢。
这是我目前正在做的,在默认优先级线程(qos_class_utility
)上:
func jpegRepresentationOfImage(image: CIImage) -> NSData {
let eaglContext = EAGLContext(API: .OpenGLES2)
let ciContext = CIContext(EAGLContext: eaglContext)
let outputImageRef = ciContext.createCGImage(image, fromRect: image.extent())
let uiImage = UIImage(CGImage: outputImageRef, scale: 1.0, orientation: UIImageOrientation.Up)
return UIImageJPEGRepresentation(uiImage, 0.9) //this takes upwards of 20-30 seconds with large photos!
}
//writing out to disk:
var error: NSError?
let success = jpegData.writeToURL(contentEditingOutput.renderedContentURL, options: NSDataWritingOptions.AtomicWrite, error: &error)