我正在使用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
。
另外值得注意的是,第二种解决方案比第一种解决方案更有效。
答案 0 :(得分:9)
您可以改为复制原始数据
这样做的好处是不会重新编码文件,不会使文件变大,不会通过额外压缩而丢失质量并保留文件中的任何元数据。
也应该是最快的方式。
假设您有theAsset
和filepath
将其保存到。
还应该添加错误处理。
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
});