从ALAssetRepresentation中为CGImageRef设置最大大小

我目前使用下面的代码从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]; 

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

 CGImageRef ref = [rep fullResolutionImage]; 

我想在应用程序崩溃之前检测此情况,或者(理想情况下)为返回的图像设置最大大小。

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

此外,使用资源的字节大小是不可靠的,因为高度压缩的格式(例如JPG)可能在封装大小方面很小,但是如果它们的像素大小(低细节图像,高度压缩的图像),则仍然消耗太多内存。

任何关于如何获取图像的尺寸和事先检测到这种情况的input,所以我可以取消加载和显示错误,或如何获得这样一个大型资产的较小版本将不胜感激。

更新:

经过一些讨论后的评论。

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

 [asset metadata] 

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

我的老回答:

在下面,如果有人发现这个想法有帮助:

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

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

从文件的文件大小开始运行fromOffset检查。 和(文件大小)的(想要的最大)结尾的长度。

读取缓冲区中的大小。 如果它比请求小,那么你没事。 如果它与请求的范围完全一样,那么文件中可能还有更多(可能更大)。

如果是,请运行getBytes的新请求:fromOffset:length:error: *这次是从最后一个请求的长度和新长度的fromOffset。

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

但从来没有一个太大的缓冲区/文件