我目前正在使用以下代码从 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
将返回较小的图像,但是该应用程序需要更高的图像分辨率才能进行缩放。
此外,使用 Assets 的字节大小是不可靠的,因为高度压缩的格式(例如 JPG)在打包后的大小可能很小,但如果它们的像素大小很高(低细节图像、高度压缩的图像),仍然会消耗太多内存.
任何有关如何获取图像尺寸并事先检测到这种情况以便我可以取消加载并显示错误或如何获取如此大 Assets 的较小版本的任何输入都将不胜感激。
最佳答案
更新:
在评论中进行了一些讨论。
您可以通过调用获取文件/ Assets 的Exif信息
[asset metadata]
我找到的引用在这里sarofox.alasset-image-metadata 该页面还显示了如何获取各个属性。 这应该允许您在打开文件/ Assets 之前获取像素大小。
我的旧答案:
在下面,以防有人觉得这个想法有帮助。:
这只是一个猜测。 但是你能不能不使用 ALAssetRepresentation getBytes:fromOffset:length:error:
使用您期望的设备相机图像的字节大小。
从文件大小的开头使用 fromOffset 运行检查。以及文件大小的(想要的最大)末尾的长度。
读取缓冲区中的大小。如果它小于请求那么你没问题。 如果它与请求的范围完全相同,那么文件中可能还剩下更多(可能更大。)
如果是这样,运行一个新请求 getBytes:fromOffset:length:error:* 这次使用来自上一个请求的长度和新长度的 fromOffset。
然后您可以将结果相加并确定整个文件是否太大。
但永远不要有太大的缓冲区/文件
关于iphone - 从 ALAssetRepresentation 设置 CGImageRef 的最大尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8840307/