iOS圖片壓縮----中的‘壓’和‘縮’

 開發(fā)的同志們對圖片壓縮都不陌生,幾乎涵蓋所有的APP中,
 最常見的圖片上傳也要求我們做壓縮,對圖片的大小做控制,比如2M以內(nèi), 
 800*1280等

1、圖片的“壓”和“縮”概念

“壓” 是指文件體積變小,但是像素?cái)?shù)不變,長寬尺寸不變,那么質(zhì)量可能下降。
“縮” 是指文件的尺寸變小,也就是像素?cái)?shù)減少,而長寬尺寸變小,文件體積同樣會(huì)減小。

2、圖片的壓處理

對于“壓”的功能,使用的UIImageJPEGRepresentation或UIImagePNGRepresentation方法實(shí)現(xiàn)。
這里我也分了三種關(guān)于圖片畫質(zhì)的壓
1)圖片大于2M的,將壓縮系數(shù)調(diào)整到0.7
2)圖片在0.5M<image<2M,將壓縮系數(shù)調(diào)整到0.8
3)圖片小于0.5M,壓縮系數(shù)可以寫0.9或者1,我這里小于0.5的不壓

注意:系數(shù)不要寫的太小,會(huì)失真嚴(yán)重

-(NSData *)zipNSDataWithImage:(UIImage *)sourceImage{
    //進(jìn)行圖像的畫面質(zhì)量壓
    NSData *data=UIImageJPEGRepresentation(sourceImage, 1.0);
//
    if (data.length>512*1024) {
        if (data.length>2 * 1024*1024) {//2M以及以上 
            data=UIImageJPEGRepresentation(newImage, 0.7);
        }else  {//0.5M-2M
            data=UIImageJPEGRepresentation(newImage, 0.8);
        }
    }else {
            //data=UIImageJPEGRepresentation(newImage, 0.9);
            data=UIImageJPEGRepresentation(newImage, 1.0);
        }
    return data;
}

3、圖片的縮處理

這里我將圖片分為三種情況進(jìn)行處理
1)寬高均大于1280,取較大值等于1280,較大值等比例壓縮
2)寬或高一個(gè)大于1280,取較大的等于1280,較小的等比壓縮
3)寬高均小于1280,壓縮比例不變

對于縮的處理,圖片是不會(huì)失真的,只是變小而已。

-(UIImage *)zipScaleWithImage:(UIImage *)sourceImage{
    //進(jìn)行圖像尺寸的壓縮
    CGSize imageSize = sourceImage.size;//取出要壓縮的image尺寸
    CGFloat width = imageSize.width;    //圖片寬度
    CGFloat height = imageSize.height;  //圖片高度
    //1.寬高大于1280(寬高比不按照2來算,按照1來算)
    if (width>1280||height>1280) {
        if (width>height) {
            CGFloat scale = height/width;
            width = 1280;
            height = width*scale;
        }else{
            CGFloat scale = width/height;
            height = 1280;
            width = height*scale;
        }
    //2.寬大于1280高小于1280
    }else if(width>1280||height<1280){
        CGFloat scale = height/width;
        width = 1280;
        height = width*scale;
    //3.寬小于1280高大于1280
    }else if(width<1280||height>1280){
        CGFloat scale = width/height;
        height = 1280;
        width = height*scale;
    //4.寬高都小于1280
    }else{
    }

//進(jìn)行尺寸重繪
   // UIGraphicsBeginImageContext(CGSizeMake(width, height));
UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), NO, [UIScreen mainScreen].scale);//強(qiáng)烈建議使用這種方法
    [sourceImage drawInRect:CGRectMake(0,0,width,height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

4、圖片的壓縮

將壓和縮結(jié)合在一起

-(NSData *)zipNSDataWithImage:(UIImage *)sourceImage{
    //進(jìn)行圖像尺寸的壓縮
    CGSize imageSize = sourceImage.size;//取出要壓縮的image尺寸
    CGFloat width = imageSize.width;    //圖片寬度
    CGFloat height = imageSize.height;  //圖片高度
    //1.寬高大于1280(寬高比不按照2來算,按照1來算)
    if (width>1280||height>1280) {
        if (width>height) {
            CGFloat scale = height/width;
            width = 1280;
            height = width*scale;
        }else{
            CGFloat scale = width/height;
            height = 1280;
            width = height*scale;
        }
    //2.寬大于1280高小于1280
    }else if(width>1280||height<1280){
        CGFloat scale = height/width;
        width = 1280;
        height = width*scale;
    //3.寬小于1280高大于1280
    }else if(width<1280||height>1280){
        CGFloat scale = width/height;
        height = 1280;
        width = height*scale;
    //4.寬高都小于1280
    }else{
    }
    //UIGraphicsBeginImageContext(CGSizeMake(width, height));
UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), NO, [UIScreen mainScreen].scale);//強(qiáng)烈建議使用這種方法
    [sourceImage drawInRect:CGRectMake(0,0,width,height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    //進(jìn)行圖像的畫面質(zhì)量壓縮
    NSData *data=UIImageJPEGRepresentation(newImage, 1.0);
    if (data.length>512*1024) {
        if (data.length>2 * 1024*1024) {//2M以及以上
            data=UIImageJPEGRepresentation(newImage, 0.7);
        }else {//0.5M-2M
            data=UIImageJPEGRepresentation(newImage, 0.8);
        }
    }else{
        //data=UIImageJPEGRepresentation(newImage, 0.9);
    data=UIImageJPEGRepresentation(newImage, 1.0);
}
    return data;
}

參考:http://www.itdecent.cn/p/0b1d10cf8f61?from=groupmessage

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容