Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does my UIImage take up so much memory?

I have a UIImage that I'm loading into one of my app's views. It is a 10.7 MB image, but when it loads in the app, the app's resource usage suddenly jumps by 50 MB. Why does it do this? Shouldn't memory used increase by only about 10.7MB? I am certain that loading the image is what causes the jump in memory usage because I tried commenting these lines out and the memory usage went back to around 8 MB. Here's how I load the image:

UIImage *image = [UIImage imageNamed:@"background.jpg"];
self.backgroundImageView = [[UIImageView alloc] initWithImage:image];
[self.view addSubview:self.backgroundImageView];

If there is no way to decrease the memory used by this image, is there a way to force it to deallocate when I want it to? I'm using ARC.

like image 984
TheSneak Avatar asked Mar 26 '14 13:03

TheSneak


2 Answers

No, it should not be 10.7MB. The 10.7MB is the compressed size of the image. The image loaded in to the UIImage object is a decoded image.

For each pixel in the image 4 bytes (R,G,B and Alpha) are used, therefore you can calculate the memory size, height x width x 4 = total bytes in memory.

So the moment you loaded the image into memory it will take up lots of memory, and since a UIImageView is used to present the image and as a subview the images is kept in memory.

You should try and change the size of the image to match the size of the iOS screen size.

like image 190
rckoenes Avatar answered Oct 19 '22 17:10

rckoenes


As @rckoenes said Don't show the images with high file size. You need to resize the image before you display it.

UIImage *image = [UIImage imageNamed:@"background.jpg"];
self.backgroundImageView =[self imageWithImage:display scaledToSize:CGSizeMake(20, 20)];//Give your CGSize of the UIImageView.
[self.view addSubview:self.backgroundImageView];


-(UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
    //UIGraphicsBeginImageContext(newSize);
    // In next line, pass 0.0 to use the current device's pixel scaling factor (and thus account for Retina resolution).
    // Pass 1.0 to force exact pixel size.
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}
like image 35
AlgoCoder Avatar answered Oct 19 '22 17:10

AlgoCoder