【问题标题】:Set Maximum Size for CGImageRef from ALAssetRepresentation从 ALAssetRepresentation 为 CGImageRef 设置最大大小
【发布时间】:2012-01-12 18:27:52
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    更新:

    在 cmets 中经过一番讨论。

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

    [asset metadata]
    

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

    我的老答案:

    在下面,以防有人觉得这个想法有帮助。:

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

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

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

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

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

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

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

    【讨论】:

    • 感谢您的想法。问题是压缩图像的文件大小无关紧要。例如,仅包含白色的 6000px*6000px 的 PNG 字节大小会非常小,但一旦解压缩以供查看,就会变得非常大。
    • 我明白了,所以你想获得投影像素大小
    • 是的。我已经更新了问题以使这一点更清楚。感谢您指出。 :)
    • 所以四处挖掘我发现sarofax.wordpress.com/2011/07/10/alasset-image-metadata 这似乎意味着您可以使用 [asset metadata] 从资产中获取 exif 数据。如果这有帮助,我会更新我的答案。
    • 是的,这有帮助!请更新您的答案,以便我投票并标记为正确。
    猜你喜欢
    • 1970-01-01
    • 2019-02-25
    • 2018-06-27
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 2013-10-05
    • 2018-04-14
    相关资源
    最近更新 更多