我需要最有效的方式将图像保存到磁盘.
我正在使用这个代码
+ (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上的磁盘”.但是,如果共识是我应该更新它.
谢谢.
解决方法
您可以尝试使用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 ); }