来自照片库的UIImage非常大

时间:2010-10-05 19:43:16

标签: iphone memory uikit uiimage uiimagepickercontroller

在我的游戏中,我使用UIImagePickerController从iPhone的照片库中抓取图像,该图像返回UIImage。因为图像是一个巨大的分辨率(1536x2048),这个UIImage在内存中占用了近20mb。为了解决这个问题,我在使用它生成精灵之前大幅缩小了图像,这可以减少内存占用。但是,在图像调整大小之前有一段时间我的内存使用率非常高,我担心这会导致内存不足的情况下崩溃(尽管我没有得到任何低内存警告)。任何人对如何处理这种情况都有任何想法?

谢谢!

2 个答案:

答案 0 :(得分:1)

看看这个,它谈到了正确调整图像大小等等:

https://stackoverflow.com/questions/1282830/uiimagepickercontroller-uiimage-memory-and-more

它是关于uiimagepickercontroller,uiimage,memory等常见问题的精彩教程。

修改

处理UIImagePickerController时,内存警告非常常见。使用相机时尤其如此。请记住,虽然磁盘上的JPG或PNG可能只有几MB,但用于绘制图像的未压缩内存位图使用的内容要多得多。

没有什么是你必须做错的,但可以做一些改进:

为什么不将图像写入磁盘并将数据路径存储到数据库中,而不是将图像字节存储在核心数据中?

如果你使用自动释放,而不是使用那么多自动释放的图像,你能找到一种方法来直接管理它们的生命周期并尽快发布它们吗?

您最好的选择可能是在处理后尽快将图像写入磁盘并释放他们正在使用的内存。然后使用Core Data而不是原始数据存储它们的位置。

甚至删除所有加载的图像,存储到磁盘,加载新图像,然后存储到磁盘,然后通过路径加载图像。类似的东西。

你可以像这样修改一些代码: Getting crash after picking images from UIImagePickerController (Related to memory leak?)

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{

    [self dismissModalViewControllerAnimated:YES];

    if (object.imagePath != nil) {
        [self deleteImages];
    }
    dispatch_queue_t image_queue;
    image_queue = dispatch_queue_create("com.gordonfontenot.app", NULL);

    dispatch_async(image_queue, ^{

        NSDate *now = [NSDate date];

        NSDateFormatter *f = [[NSDateFormatter alloc] init];
        [f setDateFormat:@"yyyyMMDDHHmmss"];

        NSString *imageName = [NSString stringWithFormat:@"Image-%@-%i", [f stringFromDate:now], arc4random() % 100];
        NSString *thumbName = [NSString stringWithFormat:@"%@-thumb", imageName];

        [f release];

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];

        NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:imageName];
        NSString *thumbPath = [documentsDirectory stringByAppendingPathComponent:thumbName];

        NSData *thumbImageData = UIImagePNGRepresentation([UIImageManipulator scaleImage:[info objectForKey:@"UIImagePickerControllerEditedImage"] toSize:CGSizeMake(120, 120)]);
        [thumbImageData writeToFile:thumbPath atomically:NO];
        dispatch_async(dispatch_get_main_queue(), ^{
            object.thumbPath = thumbPath;
            [self setupImageButton];
            imageButton.enabled = NO;
            [self setupChooseImageButton];
        });
        NSData *fullImageData = UIImagePNGRepresentation([UIImageManipulator scaleImage:[info objectForKey:@"UIImagePickerControllerOriginalImage"] toSize:CGSizeMake(800, 600)]);
        [fullImageData writeToFile:fullPath atomically:NO];

        dispatch_async(dispatch_get_main_queue(), ^{
            imageButton.enabled = YES;
            object.imagePath = fullPath;
        });

        if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
            UIImageWriteToSavedPhotosAlbum([info objectForKey:@"UIImagePickerControllerOriginalImage"], self, nil, nil);
        }

    });
    dispatch_release(image_queue);
}

希望你有足够的信息可以从这里继续。

<强> PK

答案 1 :(得分:0)

我可以确切地确认你在说什么:UIImagePicker在其生命周期的一个相当短暂的时刻,是一个巨大的RAM占用。

我可以告诉你的是在你的路上尽可能多地清除内存。我设法通过抛弃我在内存中的所有其他图像并在我捕获并调整UIImage的大小后将其重新加载来最小化崩溃。 m从Picker返回。

我找到的唯一真正的解决方案是让自己成为iPhone 4.它有足够的内存来应对。我的可怜的旧3G很容易被UIImagePicker粉碎。