1

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

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

Ps:我尝试使用 UIImageJPEGRepresentation(image,scale) 压缩图像,虽然图像大小从 10 MB 减小到 100 KB,但是当我尝试加载压缩图像时,内存问题再次出现。(貌似iOS在某种程度上解压了)

4

2 回答 2

3

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

在内存中,图像占用 WIDTH*HEIGHT*4 像素,因此假设您的图像为 1000x1000px,您最终使用 4Mb 内存。

UIImageJPEGRepresentation 使用压缩因子保存图像,因此您最终会在磁盘上获得较小的图像,但图像仍然具有相同的尺寸。

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

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

  • 从下载的数据创建一个CGImageSource
  • 使用 2 个属性kCGImageSourceCreateThumbnailFromImageIfAbsentkCGImageSourceThumbnailMaxPixelSize调用CGImageSourceCreateThumbnailAtIndex
于 2012-12-04T15:48:43.113 回答
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);
于 2012-12-05T06:00:00.403 回答