微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

从仪器分析我了解到,我将图像保存到磁盘的方式导致内存尖峰到〜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 );
}

原文地址:https://www.jb51.cc/iOS/337086.html

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

相关推荐