關(guān)于圖片壓縮的代碼實(shí)現(xiàn)Swift

對圖片壓縮這一塊之前也沒具體研究過翔脱,因?yàn)轫?xiàng)目中要處理用戶發(fā)布的圖片磁滚,所以Google了一下這個問題...

第一部分是圖片尺寸的壓縮

在網(wǎng)上搜索一番育韩,發(fā)現(xiàn)一篇不錯的文章討論了微信的圖片尺寸轉(zhuǎn)換規(guī)則,微信縮小尺寸基本上是圍繞1280的pixel來展開的蛇更,還有些文章也提到了pixel最好是8的倍數(shù)之類的內(nèi)容瞻赶,很巧的是1280正好也符合這個要求。

總結(jié)之后的規(guī)則是這樣的:

a派任,圖片寬或者高均小于或等于1280時圖片尺寸保持不變砸逊,不改變圖片大小
b,寬或者高大于1280,但是圖片寬度高度比小于或等于2掌逛,則將圖片寬或者高取值大的等比壓縮至1280
c师逸,寬或者高均大于1280,但是圖片寬高比大于2豆混,則寬或者高取值小的等比壓縮至1280
**d, **寬或者高篓像,只有一個值大于1280,并且寬高比超過2皿伺,不改變圖片大小

那么接下來就簡單了员辩,按照規(guī)則以下是代碼部分

private func resizeImage(originalImg:UIImage) -> UIImage{

        //prepare constants
        let width = originalImg.size.width
        let height = originalImg.size.height
        let scale = width/height
        
        var sizeChange = CGSize()
        
        if width <= 1280 && height <= 1280{ //a,圖片寬或者高均小于或等于1280時圖片尺寸保持不變心傀,不改變圖片大小
            return originalImg
        }else if width > 1280 || height > 1280 {//b,寬或者高大于1280屈暗,但是圖片寬度高度比小于或等于2拆讯,則將圖片寬或者高取大的等比壓縮至1280
            
            if scale <= 2 && scale >= 1 {
                let changedWidth:CGFloat = 1280
                let changedheight:CGFloat = changedWidth / scale
                sizeChange = CGSize(width: changedWidth, height: changedheight)
            
            }else if scale >= 0.5 && scale <= 1 {
                
                let changedheight:CGFloat = 1280
                let changedWidth:CGFloat = changedheight * scale
                sizeChange = CGSize(width: changedWidth, height: changedheight)
                
            }else if width > 1280 && height > 1280 {//寬以及高均大于1280脂男,但是圖片寬高比大于2時,則寬或者高取小的等比壓縮至1280
                
                if scale > 2 {//高的值比較小
                    
                    let changedheight:CGFloat = 1280
                    let changedWidth:CGFloat = changedheight * scale
                    sizeChange = CGSize(width: changedWidth, height: changedheight)
                    
                }else if scale < 0.5{//寬的值比較小
                    
                    let changedWidth:CGFloat = 1280
                    let changedheight:CGFloat = changedWidth / scale
                    sizeChange = CGSize(width: changedWidth, height: changedheight)
                    
                }
            }else {//d, 寬或者高种呐,只有一個大于1280宰翅,并且寬高比超過2,不改變圖片大小
                return originalImg
            }
        }

        UIGraphicsBeginImageContext(sizeChange)
        
        //draw resized image on Context
        originalImg.drawInRect(CGRectMake(0, 0, sizeChange.width, sizeChange.height))

        //create UIImage
        let resizedImg = UIGraphicsGetImageFromCurrentImageContext()
        
        UIGraphicsEndImageContext()
        
        return resizedImg
        
    }

感覺上寫得有些啰嗦爽室,以后再修改吧汁讼,打印了一下轉(zhuǎn)換后的大小,效果也是挺好的阔墩,打印結(jié)果如下:

Screen Shot 2016-06-08 at 5.12.08 PM.png

第二步就是文件大小的再壓縮

因?yàn)橄Mw的壓縮大小控制在100-200k左右嘿架,這個沒有網(wǎng)上細(xì)查,所以自己亂寫了一個簡單的處理算法啸箫,如下:

   //圖片壓縮 1000kb以下的圖片控制在100kb-200kb之間
    func compressImageSize(image:UIImage) -> NSData{
        
        if originalImgSize>1500 {
            zipImageData = UIImageJPEGRepresentation(image,0.1)!
        }else if originalImgSize>600 {
            zipImageData = UIImageJPEGRepresentation(image,0.2)!
        }else if originalImgSize>400 {
            zipImageData = UIImageJPEGRepresentation(image,0.3)!
        }else if originalImgSize>300 {
            zipImageData = UIImageJPEGRepresentation(image,0.4)!
        }else if originalImgSize>200 {
            zipImageData = UIImageJPEGRepresentation(image,0.5)!
        }
        return zipImageData
    }

尾聲

經(jīng)過圖片尺寸與質(zhì)量的雙重壓縮后耸彪,上傳到服務(wù)器的圖片的體積已經(jīng)比較小了,特別用手機(jī)拍攝的高清圖片忘苛,下一步的話可以根據(jù)項(xiàng)目的要求做一些縮略圖蝉娜,也可以交給服務(wù)器端的人處理唱较。
最后附上github鏈接.

后記

因?yàn)轫?xiàng)目需要,我又添加了一個水印在圖片上召川,google一下代碼也很簡單南缓,其中使用

UIGraphicsBeginImageContextWithOptions(size, NO, 0);

時發(fā)現(xiàn)一個問題,當(dāng)同樣大小的情況下畫一次圖像后荧呐,圖片會變大很多, 特別是大圖汉形,比如一個5m的圖片會增大到40m左右,所以如果想保持圖片體積不變的話倍阐,應(yīng)該使用

UIGraphicsBeginImageContextWithOptions(size, NO, 1);

或者

UIGraphicsBeginImageContext(size)

具體的原理可以參見apple的文檔, 雖然很努力地看了获雕,但是沒看懂,如果沒看懂那就是因?yàn)椴粔蚺κ盏罚詺w正傳届案,文中提到了,影響圖像尺寸的值:Scale Factor比例系數(shù)罢艾,也就是長與寬的比楣颠,設(shè)1才是原始的比例圖像,設(shè)成0就變成屏幕的比例圖像咐蚯,根據(jù)屏幕的ScaleFactor的定義

For standard-resolution displays, the scale factor is 1.0
 and one point equals one pixel. For Retina displays, the scale factor is 2.0
 and one point is represented by four pixels.

所以圖片變大了童漩。

PS:壓縮過的圖像,NSData的大小不等于UIImage的大小春锋,而png格式的圖片比同質(zhì)量同分辨率的jpg和jpeg格式圖片大數(shù)倍矫膨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市期奔,隨后出現(xiàn)的幾起案子侧馅,更是在濱河造成了極大的恐慌,老刑警劉巖呐萌,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馁痴,死亡現(xiàn)場離奇詭異,居然都是意外死亡肺孤,警方通過查閱死者的電腦和手機(jī)罗晕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赠堵,“玉大人小渊,你說我怎么就攤上這事∶0龋” “怎么了酬屉?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長杂靶。 經(jīng)常有香客問我梆惯,道長酱鸭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任垛吗,我火速辦了婚禮凹髓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘怯屉。我一直安慰自己蔚舀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布锨络。 她就那樣靜靜地躺著赌躺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪羡儿。 梳的紋絲不亂的頭發(fā)上礼患,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機(jī)與錄音掠归,去河邊找鬼缅叠。 笑死,一個胖子當(dāng)著我的面吹牛虏冻,可吹牛的內(nèi)容都是我干的肤粱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼厨相,長吁一口氣:“原來是場噩夢啊……” “哼领曼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蛮穿,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤庶骄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绪撵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓢姻,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祝蝠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年音诈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绎狭。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡细溅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出儡嘶,到底是詐尸還是另有隱情喇聊,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布蹦狂,位于F島的核電站誓篱,受9級特大地震影響朋贬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窜骄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一锦募、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧邻遏,春花似錦糠亩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至糊饱,卻和暖如春垂寥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背另锋。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工矫废, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人砰蠢。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓蓖扑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親台舱。 傳聞我的和親對象是個殘疾皇子律杠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

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