我需要最有效的方式将图像保存到磁盘.
我正在使用这个代码
+ (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上保存照片到磁盘的大多数内存有效的方式?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)