3

我目前正在使用以下代码从 iOS 应用程序中的 ALAsset 获取 UIImage。

ALAssetRepresentation *rep = [self.asset defaultRepresentation];
CGImageRef ref = [rep fullResolutionImage];
ALAssetOrientation orientation = [[self.asset valueForProperty:@"ALAssetPropertyOrientation"] intValue];
UIImage *image = [UIImage imageWithCGImage:ref scale:1.0 orientation:(UIImageOrientation)orientation];

只要图像相当小(例如,用设备的相机拍摄),这种方法就可以很好地工作。但是,如果图像太大(6000px^2 或更大),应用程序将在此步骤中耗尽内存:

CGImageRef ref = [rep fullResolutionImage];

我想在应用程序崩溃或(理想情况下)为返回的图像设置最大尺寸之前检测到这种情况。

我知道这fullScreenImage将返回一个较小的图像,但是该应用程序需要从图像中获得更高的分辨率才能进行缩放。

此外,使用资产的字节大小是不可靠的,因为高度压缩的格式(如 JPG)可能在打包后的大小很小,但如果它们的像素大小很高(低细节图像、高度压缩的图像),仍然会消耗过多的内存。

任何有关如何获取图像尺寸并事先检测这种情况的输入,以便我可以取消加载并显示错误或如何获得如此大资产的较小版本,将不胜感激。

4

1 回答 1

2

更新:

经过评论中的一些讨论。

您可以通过调用获取文件/资产的 Exif 信息

[asset metadata]

我找到的参考在这里sarofox.alasset-image-metadata 该页面还显示了如何获取单个属性。这应该允许您在打开文件/资产之前获取像素大小。

我的老答案:

如下,以防有人觉得这个想法有帮助:

这只是一个猜测。但是你能不使用ALAssetRepresentation getBytes:fromOffset:length:error:

使用您期望设备相机图像的字节大小。

从文件的文件大小开始使用 fromOffset 运行检查。以及到文件大小(想要的最大值)结尾的长度。

读取缓冲区中的大小。如果它小于请求,那么你就可以了。如果它与请求的范围完全相同,那么文件中可能还剩下更多(它可能更大。)

如果是这样,则运行getBytes:fromOffset:length:error: * 的新请求,这次使用来自上次请求长度和新长度的 fromOffset。

然后,您可以将结果相加并确定整个文件是否太大。

但永远不要有太大的缓冲区/文件

于 2012-01-12T20:30:38.437 回答