ios – 给定CIImage,将图像数据写入磁盘的最快方法是什么?

我正在使用PhotoKit,并已实现过滤器用户可以应用于照片库中的照片.我目前正在获取图像,应用过滤器,将编辑后的版本作为CI Image返回,然后使用UI ImageJPEGRepresentation将CIImage转换为NSData,这样我就可以将其写入磁盘.虽然这种方法效果很好,但当用户尝试编辑非常大(如30 MB)的照片时,这可能需要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)

解决方法

我建议使用CGImageDestination将CGImage直接传递给ImageIO.您可以将字典传递给CGImageDestinationAddImage以指示压缩质量,图像方向等.

CFDataRef save_cgimage_to_jpeg (CGImageRef image)
{
    CFMutableDataRef cfdata = CFDataCreateMutable(nil,0);
    CGImageDestinationRef dest = CGImageDestinationCreateWithData(data,CFSTR("public.jpeg"),1,NULL);
    CGImageDestinationAddImage(dest,image,NULL);
    if(!CGImageDestinationFinalize(dest))
        ; // error
    CFRelease(dest);
    return cfdata
}

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...