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

如何在iOS上快速将图像保存到磁盘?,ios,image,save,disk,alasset,Ios,Image,Save,Disk,Alasset,我使用ALAsset检索这样的图像: [[asset defaultRepresentation] fullResolutionImage]] 这返回CGImageRef,我想尽快将其保存到磁盘 解决方案1: UIImage *currentImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]]; NSData *currentImageData = UIImagePNGRep

我使用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
替换为
uiimagejpegresentation
。 对于解决方案2,已将
kUTTypePNG
替换为
kUTTypeJPEG


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

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

没有这样的方法来加快过程,但一种可能的解决方案是使用线程,这样,您将不会阻塞主线程,并将为用户提供更好的体验:

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

您只需复制原始数据即可。
这样做的优点是不会对文件进行重新编码,不会使文件变大,不会因额外的压缩而丢失质量,并保留文件中的任何元数据。 也应该是最快的方式。
假设您有
资产
文件路径
来保存它。
还应该添加错误处理

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];
}

我明白。但还有其他更有效的方法吗?我不需要PNG。实际上任何格式都可以。我只需要将原始图像从设置复制到我的自定义文件夹?ThanksI刚刚尝试使用JPEG表示法——它比PNG表示法快了一半左右(仍然大约1秒)。这样好多了。但仍然不是我所期望的。还有别的吗?我在问题中发布的两种解决方案之间的区别是什么。与另一种方法相比有什么优势?最耗时的操作是图像压缩,因此两种方法所需的时间大致相同。如果您只需要一个图像,您可以保存CGImage的字节,然后加载它们,这样压缩将被忽略。不,我将保存多个图像。你有什么例子吗?而且,我不需要压缩。原始图像是可以的…我没有一个例子,看看这个问题,例如:问题是图像的方向信息丢失了