Я работаю с PhotoKit и внедрил фильтры, которые пользователи могут применять к фотографиям в своей библиотеке фотографий. В настоящее время я получаю изображение, применяю фильтр, возвращаю отредактированную версию как CIImage
, затем я конвертирую CIImage
в NSData
с помощью UIImageJPEGRepresentation
, чтобы записать это на диск. Хотя это прекрасно работает, когда пользователи пытаются редактировать действительно большие (например, 30 МБ) фотографии, это может занять более 30 секунд, при этом 98% времени тратится на UIImageJPEGRepresentation
(статистика, полученная из инструментов).
Я ищу более эффективный способ сохранить это отредактированное фото на диск без ущерба для качества, если это возможно.
Я понимаю, что 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)