gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:28:35 24 4
gpt4 key购买 nike

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

[[asset defaultRepresentation] fullResolutionImage]]

这将返回 CGImageRef,我想尽快将其保存到磁盘...

解决方案一:

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

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

最佳答案

您可以只复制原始数据。
这样做的优点是不会重新编码文件、不会使文件变大、不会因额外压缩而降低质量以及保留文件中的任何元数据。也应该是最快的方法。
假设您有 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];
}

关于ios - 如何在 iOS 上快速将 ALAsset 图像保存到磁盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9260689/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com