iOS 上傳圖片壓縮處理

iOS圖片壓縮,想必這是一個(gè)比較大切值得深入的一個(gè)研究日裙。所以太深入的這里我也不會(huì)去講,之所以寫(xiě)這篇惰蜜,是因?yàn)槲覀冊(cè)陂_(kāi)發(fā)中昂拂,因?yàn)閕phone拍照后,直接上傳的圖片大多數(shù)像素比較高抛猖,尺寸比較大格侯,一般都在2-3M,所以在手機(jī)上傳财著,用戶(hù)等待時(shí)間過(guò)于長(zhǎng)联四,同時(shí)因?yàn)樽鳛槭謾C(jī)展示的產(chǎn)品圖,也并不需要太高清晰的圖片撑教。所以產(chǎn)品要求控制圖片在500KB以下朝墩。故我寫(xiě)了一個(gè)簡(jiǎn)單的算法以供大家參考。
寫(xiě)這個(gè)算法前伟姐,公司的安卓同事收苏,告訴我可以參看下安卓有一個(gè)現(xiàn)成的luban算法。于是我去搜索了一下玫镐,感覺(jué)過(guò)于麻煩倒戏。有興趣的同學(xué)可以搜索一下怠噪,這里貼一個(gè)介紹的鏈接:
http://blog.csdn.net/wenyiqingnianiii/article/details/52469342
在這之前恐似,我有搜到一篇簡(jiǎn)單的對(duì)微信圖片壓縮的博文:
http://blog.csdn.net/u014220518/article/details/58136932
這篇是已1280為界,來(lái)對(duì)圖片進(jìn)行尺寸的等比壓縮的傍念。但是他有一個(gè)2的系數(shù)矫夷,我不太明白這個(gè)是從何而來(lái),所以憋槐,在我的簡(jiǎn)單算法中1280為界双藕,但是沒(méi)有用他的1這個(gè)系數(shù)。如果有研究的童鞋阳仔,可以告知這個(gè)2是什么忧陪。接下來(lái),先對(duì)圖片的壓縮進(jìn)行分解介紹。

1.圖片壓縮的概念理解

既然對(duì)圖片壓縮嘶摊,那么從文字來(lái)分析:
“壓” 是指文件體積變小延蟹,但是像素?cái)?shù)不變,長(zhǎng)寬尺寸不變叶堆,那么質(zhì)量可能下降阱飘。
“縮” 是指文件的尺寸變小,也就是像素?cái)?shù)減少虱颗,而長(zhǎng)寬尺寸變小沥匈,文件體積同樣會(huì)減小。
所以忘渔,在寫(xiě)算法的時(shí)候也會(huì)將圖片分解為這兩部分來(lái)處理高帖。

2.圖片的壓縮處理

2.1圖片的縮處理

我這里首先用的是縮的處理。
這里我將圖片分為三種情況進(jìn)行處理

1)寬高均大于1280畦粮,取較大值等于1280棋恼,較大值等比例壓縮
2)寬或高一個(gè)大于1280,取較大的等于1280锈玉,較小的等比壓縮
3)寬高均小于1280爪飘,壓縮比例不變

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

+(UIImage *)zipScaleWithImage:(UIImage *)sourceImage{
    //進(jìn)行圖像尺寸的壓縮
    CGSize imageSize = sourceImage.size;//取出要壓縮的image尺寸
    CGFloat width = imageSize.width;    //圖片寬度
    CGFloat height = imageSize.height;  //圖片高度
    //1.寬高大于1280(寬高比不按照2來(lái)算,按照1來(lái)算)
    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));
    [sourceImage drawInRect:CGRectMake(0,0,width,height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

2.2圖片的壓處理

對(duì)于“壓”的功能椅棺,使用的UIImageJPEGRepresentation或UIImagePNGRepresentation方法實(shí)現(xiàn)犁罩。
這里我也分了三種關(guān)于圖片畫(huà)質(zhì)的壓縮

1)圖片大于1M的,將壓縮系數(shù)調(diào)整到0.7
2)圖片在0.5M<image<1M,將壓縮系數(shù)調(diào)整到0.8
3)圖片小雨0.5M两疚,壓縮系數(shù)可以寫(xiě)0.9或者1
+(NSData *)zipNSDataWithImage:(UIImage *)sourceImage{
    //進(jìn)行圖像的畫(huà)面質(zhì)量壓縮
    NSData *data=UIImageJPEGRepresentation(sourceImage, 1.0);
    if (data.length>100*1024) {
        if (data.length>1024*1024) {//1M以及以上
            data=UIImageJPEGRepresentation(newImage, 0.7);
        }else if (data.length>512*1024) {//0.5M-1M
            data=UIImageJPEGRepresentation(newImage, 0.8);
        }else if (data.length>200*1024) {
            //0.25M-0.5M
            data=UIImageJPEGRepresentation(newImage, 0.9);
        }
    }
    return data;
}

兩段結(jié)合起來(lái)

+(NSData *)zipNSDataWithImage:(UIImage *)sourceImage{
    //進(jìn)行圖像尺寸的壓縮
    CGSize imageSize = sourceImage.size;//取出要壓縮的image尺寸
    CGFloat width = imageSize.width;    //圖片寬度
    CGFloat height = imageSize.height;  //圖片高度
    //1.寬高大于1280(寬高比不按照2來(lái)算床估,按照1來(lái)算)
    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));
    [sourceImage drawInRect:CGRectMake(0,0,width,height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    //進(jìn)行圖像的畫(huà)面質(zhì)量壓縮
    NSData *data=UIImageJPEGRepresentation(newImage, 1.0);
    if (data.length>100*1024) {
        if (data.length>1024*1024) {//1M以及以上
            data=UIImageJPEGRepresentation(newImage, 0.7);
        }else if (data.length>512*1024) {//0.5M-1M
            data=UIImageJPEGRepresentation(newImage, 0.8);
        }else if (data.length>200*1024) {
            //0.25M-0.5M
            data=UIImageJPEGRepresentation(newImage, 0.9);
        }
    }
    return data;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市诱渤,隨后出現(xiàn)的幾起案子丐巫,更是在濱河造成了極大的恐慌,老刑警劉巖勺美,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件递胧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赡茸,警方通過(guò)查閱死者的電腦和手機(jī)缎脾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)占卧,“玉大人遗菠,你說(shuō)我怎么就攤上這事联喘。” “怎么了辙纬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵耸袜,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我牲平,道長(zhǎng)堤框,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任纵柿,我火速辦了婚禮蜈抓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昂儒。我一直安慰自己沟使,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布渊跋。 她就那樣靜靜地躺著腊嗡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拾酝。 梳的紋絲不亂的頭發(fā)上燕少,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天,我揣著相機(jī)與錄音蒿囤,去河邊找鬼客们。 笑死,一個(gè)胖子當(dāng)著我的面吹牛材诽,可吹牛的內(nèi)容都是我干的底挫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼脸侥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼建邓!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起睁枕,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤官边,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后譬重,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拒逮,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年臀规,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栅隐。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡塔嬉,死狀恐怖玩徊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谨究,我是刑警寧澤恩袱,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站胶哲,受9級(jí)特大地震影響畔塔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸯屿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一澈吨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寄摆,春花似錦谅辣、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至勾邦,卻和暖如春蚣录,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背眷篇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工包归, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铅歼。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓公壤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親椎椰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子厦幅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容