6

How to shrink the image without affecting the quality programmatically.

After capture the image I want to reduce the size of that image without changing the quality in objective-c.

Ekta Padaliya
  • 5,743
  • 3
  • 39
  • 51
Arsad
  • 83
  • 1
  • 8
  • 2
    What size are you talking about, the size on screen or the size on disk? – Sergey Kalinichenko Oct 19 '16 at 10:49
  • 1
    Size of that image, if i can capture image size of 3 MB then i need to reduce the size as 500 KB before uploading on server. And it take from any device such as iphone(5,5S, 6) or ipad. – Arsad Oct 19 '16 at 10:52
  • `NSData *imageData = UIImageJPEGRepresentation(img, compressionQuality)` you can find many material if you google!!! – Ketan Parmar Oct 19 '16 at 11:08
  • 1
    Possible duplicate of [reduce camera/photo library image file size for less than 100 KB in iphone](http://stackoverflow.com/questions/14085055/reduce-camera-photo-library-image-file-size-for-less-than-100-kb-in-iphone) – Ketan Parmar Oct 19 '16 at 11:12

2 Answers2

11

Here is the code I have used compress the image

Code :

-(UIImage *)compressImage:(UIImage *)image{

    NSData *imgData = UIImageJPEGRepresentation(image, 1); //1 it represents the quality of the image.
    NSLog(@"Size of Image(bytes):%ld",(unsigned long)[imgData length]);

    float actualHeight = image.size.height;
    float actualWidth = image.size.width;
    float maxHeight = 600.0;
    float maxWidth = 800.0;
    float imgRatio = actualWidth/actualHeight;
    float maxRatio = maxWidth/maxHeight;
    float compressionQuality = 0.5;//50 percent compression

    if (actualHeight > maxHeight || actualWidth > maxWidth){
        if(imgRatio < maxRatio){
            //adjust width according to maxHeight
            imgRatio = maxHeight / actualHeight;
            actualWidth = imgRatio * actualWidth;
            actualHeight = maxHeight;
        }
        else if(imgRatio > maxRatio){
            //adjust height according to maxWidth
            imgRatio = maxWidth / actualWidth;
            actualHeight = imgRatio * actualHeight;
            actualWidth = maxWidth;
        }
        else{
            actualHeight = maxHeight;
            actualWidth = maxWidth;
        }
    }

    CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight);
    UIGraphicsBeginImageContext(rect.size);
    [image drawInRect:rect];
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    NSData *imageData = UIImageJPEGRepresentation(img, compressionQuality);
    UIGraphicsEndImageContext();

    NSLog(@"Size of Image(bytes):%ld",(unsigned long)[imageData length]);

    return [UIImage imageWithData:imageData];
}

So Here is the code to use the above

UIImage *org = [UIImage imageNamed:@"MacLehose Stage 7 Stunning Natural Sceneries.jpg"];

UIImage *imgCompressed = [self compressImage:org];

If you want to compress more

NSData *dataImage = UIImageJPEGRepresentation(imgCompressed, 0.0);

NSLog(@"Size of Image(bytes):%ld",(unsigned long)[dataImage length]);

By the above mentioned way I am able to compress the image from 2 MB to near about 50 KB.

halfer
  • 19,824
  • 17
  • 99
  • 186
Janmenjaya
  • 4,149
  • 1
  • 23
  • 43
5

I search a lot with this topic a lot. After few days, i found this one. Hope this is much faster then the accepted answer.

NSData *imageData;
imageData=[[NSData alloc] initWithData:UIImageJPEGRepresentation((chosenImage), 1.0)];

NSLog(@"[before] image size: %lu--", (unsigned long)[imageData length]);

CGFloat scale= (100*1024)/(CGFloat)[imageData length]; // For 100KB. 


UIImage *small_image=[UIImage imageWithCGImage:chosenImage.CGImage scale:scale orientation:chosenImage.imageOrientation];

imageData = UIImageJPEGRepresentation(small_image, scale*1.00);


NSLog(@"[after] image size: %lu:%f", (unsigned long)[imageData length],scale);

It worked for me great!. Try it once.

Jamshed Alam
  • 12,424
  • 5
  • 26
  • 49