从ALAssetRepresentation设置CGImageRef的最大大小

时间:2012-01-12 18:27:52

标签: iphone objective-c ios cocoa-touch alasset

我目前正在使用以下代码从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这样的高度压缩格式在打包大小方面可能很小但如果它们的像素大小很高(仍然会消耗太多内存)(低细节图像,高度压缩的图像)

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

1 个答案:

答案 0 :(得分:2)

更新:

在评论中进行了一些讨论。

您可以通过电话

获取文件/资产的Exif信息
[asset metadata]

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

MY OLD ANSWER:

在下面,以防任何人发现这个想法有用。:

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

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

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

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

如果是这样,请运行 getBytes:fromOffset:length:error: *的新请求,这次使用fromOffset,从上一个请求的长度和新长度开始。

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

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