imageWithCGImage的内存问题

时间:2014-07-13 22:48:29

标签: ios objective-c memory uiimage cgimageref

所以这里有一个要点我有一个程序,它有一个由许多小图像组成的大图像,它将这个图像分成许多较小的图像(如电影的帧)然后用户可以去擦洗通过

我目前使用此方法

- (NSMutableArray *)createArrayFromImage: (NSData *)largerImageData
{
    UIImage *largerImage = [UIImage imageWithData: largerImageData];
    int arraySize = (int)largerImage.size.height/largerImage.size.width; //Find out how many images there are
    NSMutableArray *imageArray = [[NSMutableArray alloc] init];
    for (int i = 0; i < arraySize; i++) {

        CGRect cropRect = CGRectMake(0, largerImage.size.width * i, largerImage.size.width, largerImage.size.width);
        CGImageRef imageRef = CGImageCreateWithImageInRect([largerImage CGImage], cropRect);
        UIImage *image = [UIImage imageWithCGImage: imageRef];
        CGImageRelease(imageRef);

        [imageArray addObject: UIImageJPEGRepresentation(image, 1.0)];
        NSLog(@"Added image %d", i);
    }

    NSLog(@"Final size %d", (int)[imageArray count]);
    return imageArray;
}

然而,由于UIImageJPEGRepresentation被调用,这非常慢,如果我只是将UIImage直接添加到数组中,那么当用户擦除数组中的图像时会更快它开始分配大量内存,迫使应用程序最终崩溃。如果有帮助,它会调用[UIImageView setImage:];。对此的任何帮助都将非常感激。

ED | T:CGImageCreateWithImageInRect可能会保留“largeImage”,这会导致它占用大量内存

2 个答案:

答案 0 :(得分:1)

基本上,您的目标似乎是随机向用户显示图像的特定部分。

如果您想要做的只是显示图像的较小部分,则不必创建较小的图像。特别是如果大图像可以立即加载到存储器中。 而是尝试查看剪裁以调整图像的可见部分。

例如,你可以试试这个。

  1. 将大图片设置为UIImageViewsizeToFit
  2. 将图片视图放在UIView
  3. UIView的帧设置为较小的图像尺寸。
  4. 外部clipsToBoundsUIView
  5. YES
  6. 调整内部transform的{​​{1}}以控制可见部分。
  7. 这与您使用UIImageView所做的基本相同,除了通过用户交互自动滚动。

    这是一个代码示例。

    UIScrollView

答案 1 :(得分:0)

而是在内存中使用小图像,如果它们的尺寸很小,请尝试将此图像保存到DB。但我不明白为什么你需要将一个大图像裁剪成一个小图像?您可以使用CATiledLayer ZOOM和预览图像的一小部分,而您只需要该部分的CGRect。