Shrink image without affecting the quality in objective c

后端 未结 2 729
小鲜肉
小鲜肉 2021-02-06 10:52

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

相关标签:
2条回答
  • 2021-02-06 11:20

    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.

    0 讨论(0)
  • 2021-02-06 11:27

    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.

    0 讨论(0)
提交回复
热议问题