Coverflow在加载高分辨率图像时崩溃

时间:2012-12-04 15:38:00

标签: iphone ios memory crash coverflow

我正在尝试使用 AsyncImageView https://github.com/nicklockwood/AsyncImageView)作为封面实现 Coverflow(iCarousel)。它适用于大小高达4 MB的图像。但是,当尝试加载大小超过10 MB的图像时,应用程序崩溃了。我的问题是 -

1)我可以加载大小为10 MB的图像而不需要平铺吗?由于图像源来自设备相机,是否可以平铺这些图像然后加载这些图像。如果是这样,你可以在拼贴大图像时分享一些想法/代码块吗?

Ps:我尝试使用UIImageJPEGRepresentation(图像,比例)压缩图像,虽然图像大小从10 MB减少到100 KB,但是当我尝试加载压缩图像时,记忆问题再次出现。 (看起来iOS在某种程度上解压缩)

2 个答案:

答案 0 :(得分:3)

您对图像的尺寸及其在磁盘上的尺寸感到困惑。

在内存中,图像采用WIDTH * HEIGHT * 4像素,所以假设您的图像是1000x1000px,最终使用的是4Mb ram。

UIImageJPEGRepresentation使用压缩系数保存图像,因此最终在磁盘上显示较小的图像,但图像的尺寸仍然相同。

要解决您的问题,您需要将下载的图像缩放到封面项目的正确尺寸。

您可以使用ImageIO框架执行此操作:

  • 从下载的数据
  • 创建 CGImageSource
  • 使用2个属性 kCGImageSourceCreateThumbnailFromImageIfAbsent kCGImageSourceThumbnailMaxPixelSize
  • 调用 CGImageSourceCreateThumbnailAtIndex

答案 1 :(得分:0)

这是工作代码

   UIImage *result = nil;
if ([data length]) { // NSData of the image


    CGImageSourceRef sourceRef = CGImageSourceCreateWithData((CFDataRef)data, nil);

    NSMutableDictionary *options = [NSMutableDictionary dictionary];

    [options setObject:(id)kCFBooleanTrue forKey:(id)kCGImageSourceCreateThumbnailFromImageIfAbsent];
    [options setObject:[NSNumber numberWithInt:400] forKey:(id)kCGImageSourceThumbnailMaxPixelSize];
    CGImageRef imageRef = CGImageSourceCreateThumbnailAtIndex(sourceRef, 0, (CFDictionaryRef)options);

    if (imageRef) {
        result = [UIImage imageWithCGImage:imageRef]; //Resulting image
        CGImageRelease(imageRef);
    }

    if (sourceRef) CFRelease(sourceRef);