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

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

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

以上是内存溢出为你收集整理的ios – 给定CIImage,将图像数据写入磁盘的最快方法是什么?全部内容,希望文章能够帮你解决ios – 给定CIImage,将图像数据写入磁盘的最快方法是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1058105.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-25
下一篇2022-05-25

发表评论

登录后才能评论

评论列表(0条)

    保存