ios – 在iPhone上保存照片到磁盘的大多数内存有效的方式?

ios – 在iPhone上保存照片到磁盘的大多数内存有效的方式?,第1张

概述从仪器分析我了解到,我将图像保存磁盘方式导致内存尖峰到〜60MB.这导致应用程序发出低内存警告,(不一致)导致运行iOS7的iPhone4S崩溃. 我需要最有效的方式将图像保存到磁盘. 我正在使用这个代码 + (void)saveImage:(UIImage *)image withName:(NSString *)name { NSData *data = UIImageJPEGRe 从仪器分析我了解到,我将图像保存到磁盘的方式导致内存尖峰到〜60MB.这导致应用程序发出低内存警告,(不一致)导致运行iOS7的iPhone4S崩溃.

我需要最有效的方式将图像保存到磁盘.

我正在使用这个代码

+ (voID)saveImage:(UIImage *)image withname:(Nsstring *)name {    NSData *data = UIImageJPEGRepresentation(image,1.0);    DLog(@"*** SIZE *** : Saving file of size %lu",(unsigned long)[data length]);    NSfileManager *fileManager = [NSfileManager defaultManager];    NSArray *paths = NSSearchPathForDirectorIEsInDomains(NSdocumentDirectory,NSUserDomainMask,YES);    Nsstring *documentsDirectory = [paths objectAtIndex:0];    Nsstring *fullPath = [documentsDirectory stringByAppendingPathComponent:name];    [fileManager createfileAtPath:fullPath contents:data attributes:nil];}

笔记:

降低UIImageJPEGRepresentation中的compressionQuality参数的值不会显着减少内存尖峰.
例如
compressionQuality = 0.8,平均超过100次写入时内存尖峰减少3MB.
然而,它确实减少了磁盘上的数据的大小(显然),但这并没有帮助我.
> UIImagePNGRepresentation代替UIImageJPEGRepresentation对此更糟糕.它较慢,导致更高的尖峰.

是否可能this approach与ImageIO会更有效率?如果是这样的话?

如果有人有任何建议,那将是巨大的.谢谢

编辑:

关于以下问题中概述的一些要点的说明.

a)虽然我正在保存多个图像,但我并没有将它们保存在一个循环中.我做了一些阅读和测试,发现一个自动释放池不会帮助我.

b)照片的大小不是60Mb.他们是在iPhone 4S拍摄的照片.

考虑到这一点,我回到试图克服我以为这个问题的想法;线NSData * data = UIImageJPEGRepresentation(image,1.0);.

导致崩溃的内存尖峰可以在下面的屏幕截图中看到.他们对应于UIImageJPEGRepresentation何时被呼叫.我也运行了时间分析器和系统使用,指出了我的方向.

漫长的故事,我移动到AVFoundation并使用照片图像数据

photoData = [AVCaptureStillimageOutput jpegStillimageNSDataRepresentation:imageSampleBuffer];

哪个返回一个NSData类型的对象,然后使用它作为使用NSfileManager写入的数据.

这完全消除了内存中的尖峰.

[self saveImageWithData:photoData];

哪里

+ (voID)saveImageWithData:(NSData *)imageData withname:(Nsstring *)name {    NSData *data = imageData;    DLog(@"*** SIZE *** : Saving file of size %lu",YES);    Nsstring *documentsDirectory = [paths objectAtIndex:0];    Nsstring *fullPath = [documentsDirectory stringByAppendingPathComponent:name];    [fileManager createfileAtPath:fullPath contents:data attributes:nil];}

PS:我没有把这个答案解释为这个问题,人们觉得它没有回答标题“大多数记忆效率的方式来保存照片到iPhone上的磁盘”.但是,如果共识是我应该更新它.

谢谢.

解决方法 使用UIImageJPEGRepresentation需要您在内存中同时拥有原始和最终的图像.它也可能缓存完全渲染的图像一段时间,这将使用大量的内存.

您可以尝试使用CGImageDestination.我不知道内存的有效性,但它有潜力将图像直接传输到磁盘.

+(voID) writeImage:(UIImage *)inImage toURL:(NSURL *)inURL withQuality:(double)inQuality {    CGImageDestinationRef destination = CGImageDestinationCreateWithURL( (CFURLRef)inURL,kUTTypeJPEG,1,NulL );    CFDictionaryRef propertIEs = (CFDictionaryRef)[NSDictionary dictionaryWithObject:[NSNumber numberWithDouble:inQuality] forKey:kCGImageDestinationLossyCompressionQuality];    CGImageDestinationAddImage( destination,[inImage CGImage],propertIEs );    CGImageDestinationFinalize( destination );    CFRelease( destination );}
总结

以上是内存溢出为你收集整理的ios – 在iPhone上保存照片到磁盘的大多数内存有效的方式?全部内容,希望文章能够帮你解决ios – 在iPhone上保存照片到磁盘的大多数内存有效的方式?所遇到的程序开发问题。

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

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

原文地址: http://outofmemory.cn/web/1112576.html

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

发表评论

登录后才能评论

评论列表(0条)

保存