- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 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/
我正在就我的问题提出这个问题Display photolibrary images in an effectual way iPhone和 Highly efficient UITableView "
我正在使用照片查看器,但不想实现垃圾按钮。 我已经准备好了按钮,一切都很好,但有以下情况: 如何实际删除 ALAsset? 我尝试在很多地方搜索但找不到答案... 谢谢 出于某种原因,我不允许发布此问
我正在尝试使用以下代码从 ALAssets 库访问视频数据 ALAssetRepresentation *rep = [asset defaultRepresentation];
我当前有一个使用 ALAsssetsLibrary 来获取照片的应用程序。我已将照片放置到 ImageView 中,并且可以上传到服务器。拍了几张照片后在真机上测试时,发现原本应该拍人像的照片变成了风
我在比较两个 ALAssets 对象时遇到了一些麻烦。我有两个 NSMutableArray:selectedImages 和 mutableAssets。我在那里存储 ALAssets 对象。但是当
您好,我正在从 ALAsset 库中获取所有照片和视频缩略图。 我的代码工作正常,我正在获取照片和视频缩略图。但是在视频缩略图中缺少视频图标及其时间戳。 [assetImageView setImag
我正在从库中获取 ALAsset,但是当我尝试设置 UIImageView 时,UIImage 为 nil。 ALAssetsLibrary *library = [[ALAssetsLibr
我正在为 iPhone 开发视频应用程序。我正在使用 AssetsLibrary 框架录制视频并将其保存到 iPhone 相机胶卷。我使用的 API 是: - (void)writeVideoAtPa
我已经查看了 SO,但找不到这个问题的有效答案。我已经使用 ALAssets 创建了一个自定义图像选择器,但现在它不是常规图像选择器,所以没有自动压缩视频。 这就是我从 Assets 中获取视频 NS
我想从照片库中复制一张图片,但我想在以后检查一下我是否已经导入了这张图片。 想象一下这个场景。 我的照片库中有一张照片。 我通过制作副本将其导入到我的应用程序中。 我从我的图库中删除了这张照片。 稍后
给定一个表示照片的 ALAsset,是否可以在不将图像加载到 UIImageView 并且不使用 aspectRationThumnail 方法的情况下检索照片的大小(高度和宽度)? 最佳答案 请注意
我正在寻找如何显示照片库中保存的图像缩略图的解决方案。我知道缩略图有方法,但结果太小(相反的全屏尺寸太大)。我想设置我想要的缩略图的自定义大小。我试图寻找任何解决方案,但我认为它太复杂了。现在我有这些
我正在尝试获取图像的时间戳,我可以获得正确的纬度和经度值,但时间戳总是返回当前时间,而不是图像的 EXIF 时间。 ALAssetsLibraryAssetForURLResultBlock resu
我正在使用 ALAssets 框架来访问照片库。第一次访问时,它会询问用户应用程序是否可以使用他们的当前位置,我知道这是必要的以及原因。 但是,在 Core Location Manager 中,有一
如何从 ALAsset 中提取文件名? 有没有办法通过 url 或其他方式获取它? 最佳答案 从 iOS 5.0 开始,您可以从 ALAssetRepresentation 类获取文件。 ALAsse
使用 iOS 4 中提供的新资源库框架,我发现我可以使用 UIImagePickerControllerReferenceURL 获取给定视频的 url。返回的url格式如下: assets-libr
出于某种原因,以下代码中 ALAsset 对象的可编辑属性始终设置为 false: ALAsset *testAsset = [[ALAsset alloc] init]; if(!testAsset
很简单,如何获取使用 ALAssets 库检索的视频的绝对路径?我想使用 ASI 框架将此视频作为文件附件上传。 如果我使用 UIImagePickerViewController,它会起作用。但这不
我的应用程序文档库中有很多图像。我想显示文档目录图像的缩略图。 我正在使用以下代码。 UIImage *thumbImage=[UIImage imageWithContentsOfFile:strI
我已将 MP4 从 iTunes 传输到我的 iPad。如果我打开视频应用程序,我可以看到它列出 - 下面有缩略图和文件名 (my_file.mp4)。然而, Assets 的实际文件名在 iOS 中
我是一名优秀的程序员,十分优秀!