如何在iOS上快速将ALAsset映像保存到磁盘?

时间:2012-02-13 12:39:57

标签: ios image save disk alasset

我正在使用ALAsset来检索这样的图像:

[[asset defaultRepresentation] fullResolutionImage]]

这将返回CGImageRef,我希望尽快保存到磁盘......

解决方案1:

UIImage *currentImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]];
NSData *currentImageData = UIImagePNGRepresentation(currentImage);
[currentImageData writeToFile:filePath atomically:YES];

解决方案2:

CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:filePath];
CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypePNG, 1, NULL);
CGImageDestinationAddImage(destination, [[asset defaultRepresentation] fullResolutionImage], nil);
CGImageDestinationFinalize(destination);

问题是两种方法在设备上的执行速度都很慢。每张图像大约需要2秒才能执行此操作。这绝对是长久的。

问题:如何加快此图像保存过程?或许还有更好的解决方案吗?

更新 两种解决方案中性能的最佳改进是将图像保存为JPEG格式而不是PNG。 因此,对于解决方案1,已将UIImagePNGRepresentation替换为UIImageJPEGRepresentation。 对于解决方案2,已将kUTTypePNG替换为kUTTypeJPEG

另外值得注意的是,第二种解决方案比第一种解决方案更有效。

3 个答案:

答案 0 :(得分:9)

您可以改为复制原始数据 这样做的好处是不会重新编码文件,不会使文件变大,不会通过额外压缩而丢失质量并保留文件中的任何元数据。 也应该是最快的方式。
假设您有theAssetfilepath将其保存到。
还应该添加错误处理。

long long sizeOfRawDataInBytes = [[theAsset defaultRepresentation] size];
NSMutableData* rawData = [NSMutableData dataWithLength:(NSUInteger) sizeOfRawDataInBytes];
void* bufferPointer = [rawData mutableBytes];
NSError* error=nil;
[[theAsset defaultRepresentation] getBytes:bufferPointer 
                                fromOffset:0
                                    length:sizeOfRawDataInBytes
                                     error:&error];
if (error) 
{
    NSLog(@"Getting bytes failed with error: %@",error);
}
else 
{
    [rawData writeToFile:filepath 
              atomically:YES];
}

答案 1 :(得分:2)

这是因为PNG压缩过程很慢,并且在iPhone的处理器上需要一段时间,特别是对于全尺寸摄影。

答案 2 :(得分:1)

没有一种方法可以加快处理速度,但可能的解决方案是使用线程,这样你就不会阻止主线程,你会为用户提供更好的体验:

dispatch_queue_t dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(dispatchQueue, ^(void) {
    // Your code here
});