我正在使用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 }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。