Necro
Necro

Reputation: 333

Compress Large UIImage

so what im doing is compressing an image repeatedly until it fits within a size frame. It it takes to many attempts, give up and later we tell the user the image is to large.

My issue is that after the image size has been reduced, its size goes WAY back up again when its changed to a UIImage.

Here is the code for reducing the image size:

    double compressionRatio = 1;
    int resizeAttempts = 5;

    NSData * imgData = UIImageJPEGRepresentation([info objectForKey:@"UIImagePickerControllerOriginalImage"],compressionRatio);

    NSLog(@"Starting Size: %i", [imgData length]);

    //Trying to push it below around about 0.4 meg
    while ([imgData length] > 400000 && resizeAttempts > 0) {
        resizeAttempts -= 1;

        NSLog(@"Image was bigger than 400000 Bytes. Resizing.");
        NSLog(@"%i Attempts Remaining",resizeAttempts);

        //Increase the compression amount
        compressionRatio = compressionRatio*0.5;

        //Test size before compression
        NSLog(@"Current Size: %i",[imgData length]);
        imgData = UIImageJPEGRepresentation([info objectForKey:@"UIImagePickerControllerOriginalImage"],compressionRatio);

        //Test size after compression
        NSLog(@"New Size: %i",[imgData length]);
    }

    //Set image by comprssed version
    savedImage = [UIImage imageWithData:imgData];

    //Check how big the image is now its been compressed and put into the UIImageView
    NSData *endData = UIImageJPEGRepresentation(savedImage,1.0);
    NSLog(@"Ending Size: %i", [endData length]);

Ok now here is the console report:

Starting Image Size: 4076994

Image was bigger than 400000 Bytes. Resizing.
4 Attempts Remaining
Current Size: 4076994
New Compressed Size: 844482

Image was bigger than 400000 Bytes. Resizing.
3 Attempts Remaining
Current Size: 844482
New Compressed Size: 357459

Ending Image Size: 2090332

As you can see the image started at 4mb big. It was compressed to 350kb, then in the end it was made into a UIImage as 2mb.

Thanks in advance to anyone who can make any sense of this.

Upvotes: 1

Views: 3038

Answers (1)

Dipen Panchasara
Dipen Panchasara

Reputation: 13600

I have modified your function a bit and got result, try it, it reduce my 10MB image to 3MB.

-(void)compraseImage
{
    UIImage *largeImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

    double compressionRatio = 1;
    int resizeAttempts = 5;

    NSData * imgData = UIImageJPEGRepresentation(largeImage,compressionRatio);

    NSLog(@"Starting Size: %i", [imgData length]);

    //Trying to push it below around about 0.4 meg
    while ([imgData length] > 400000 && resizeAttempts > 0) {
        resizeAttempts -= 1;

        NSLog(@"Image was bigger than 400000 Bytes. Resizing.");
        NSLog(@"%i Attempts Remaining",resizeAttempts);

        //Increase the compression amount
        compressionRatio = compressionRatio*0.5;
        NSLog(@"compressionRatio %f",compressionRatio);
        //Test size before compression
        NSLog(@"Current Size: %i",[imgData length]);
        imgData = UIImageJPEGRepresentation(largeImage,compressionRatio);

        //Test size after compression
        NSLog(@"New Size: %i",[imgData length]);
    }

    //Set image by comprssed version
    savedImage = [UIImage imageWithData:imgData];

    //Check how big the image is now its been compressed and put into the UIImageView

    // *** I made Change here, you were again storing it with Highest Resolution ***
    NSData *endData = UIImageJPEGRepresentation(largeImage,compressionRatio);
    NSLog(@"Ending Size: %i", [endData length]);

    NSString *path = [self createPath:@"myImage.jpg"];
    NSLog(@"%@",path);
    [endData writeToFile:path atomically:YES];
}

-(NSString *) createPath:(NSString *)withFileName
{
    NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,
                                                        YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:withFileName];
    return path;
}

Upvotes: 1

Related Questions