7

我正在使用 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 已替换UIImagePNGRepresentationUIImageJPEGRepresentation. 对于解决方案 2 已替换kUTTypePNGkUTTypeJPEG.

还值得注意的是,第二种解决方案比第一种解决方案的内存效率更高。

4

3 回答 3

9

您可以只复制原始数据。
这具有不重新编码文件、不使文件变大、不因额外压缩而损失质量以及保留文件中的任何元数据的优点。也应该是最快的方法。
假设你有theAsset和 afilepath来保存它。
还应该添加错误处理。

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];
}
于 2012-11-23T14:21:48.670 回答
2

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

于 2012-02-13T12:51:47.400 回答
1

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

dispatch_queue_t dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(dispatchQueue, ^(void) {
    // Your code here
});
于 2012-05-26T14:47:02.407 回答