Swift圖片壓縮處理

由于項(xiàng)目中有大量的上傳圖片绰筛,之前圖片的處理方式直接就用了UIImageJPEGRepresentation方式來處理,也用了很長(zhǎng)的一段時(shí)間描融,后面由于權(quán)限的開放铝噩,從相冊(cè)選擇的使用頻率變高,由于圖片的來源不一窿克,所以相片的質(zhì)量不一樣薄榛,有的是客戶從其他渠道傳輸過來的,肯定也經(jīng)過了壓縮的處理让歼,所以再經(jīng)過我們這邊統(tǒng)一的方法再去壓縮的話,將會(huì)導(dǎo)致上傳的圖片失真丽啡,不清晰谋右。針對(duì)以上痛點(diǎn),于是有了下面的處理方式.

壓縮方式1:

循環(huán)壓縮法

   /// 壓縮圖片數(shù)據(jù)-不壓尺寸
    ///
    /// - Parameters:
    ///   - maxLength: 最大長(zhǎng)度
    /// - Returns:
    func compressImageOnlength(maxLength: Int) -> Data? {
        
        guard let vData = UIImageJPEGRepresentation(self, 1) else { return nil }
        XYJLog(message: "壓縮前kb: \( Double((vData.count)/1024))")
        if vData.count < maxLength {
            return vData
        }
        var compress:CGFloat = 0.9
        guard var data = UIImageJPEGRepresentation(self, compress) else { return nil }
        while data.count > maxLength && compress > 0.01 {
            XYJLog(message: "壓縮比: \(compress)")
            compress -= 0.02
            data = UIImageJPEGRepresentation(self, compress)!
        }
        XYJLog(message: "壓縮后kb: \(Double((data.count)/1024))")
        return data
    }

由于我們的需求是最多可以五張圖片拼接處理补箍,最后壓縮的時(shí)候改执,采用此方法,可能會(huì)導(dǎo)致壓縮時(shí)間比較久坑雅,用戶體驗(yàn)不友好辈挂,于是采用了方式二

壓縮方式2:

二分壓縮法

     //二分壓縮法
     func compressImageMid(maxLength: Int) -> Data? {
        var compression: CGFloat = 1
        guard var data = UIImageJPEGRepresentation(self, 1) else { return nil }
        XYJLog(message: "壓縮前kb: \( Double((data.count)/1024))")
        if data.count < maxLength {
            return data
        }
        print("壓縮前kb", data.count / 1024, "KB")
        var max: CGFloat = 1
        var min: CGFloat = 0
        for _ in 0..<6 {
            compression = (max + min) / 2
            data = UIImageJPEGRepresentation(self, compression)!
            if CGFloat(data.count) < CGFloat(maxLength) * 0.9 {
                min = compression
            } else if data.count > maxLength {
                max = compression
            } else {
                break
            }
        }
        var resultImage: UIImage = UIImage(data: data)!
        if data.count < maxLength {
            return data
        }

方式一、二調(diào)用的方式如下

// 壓縮到1M 以內(nèi)
 var  imageData = uploadsizeImg?.compressImageMid(maxLength: 1024*1024)

采用二分壓縮法在效率上有一定的提升裹粤,但是對(duì)于五張圖片合成后终蒂,如果尺寸越大,越越容易導(dǎo)致內(nèi)存出現(xiàn)問題,嚴(yán)重的將會(huì)導(dǎo)致崩潰拇泣,所以在壓縮數(shù)據(jù)前我們需要對(duì)合成的圖片做尺寸上的壓縮

尺寸壓縮法

   /// 根據(jù)尺寸重新生成圖片
    ///
    /// - Parameter size: 設(shè)置的大小
    /// - Returns: 新圖
    public func imageWithNewSize(size: CGSize) -> UIImage? {
    
        if self.size.height > size.height {
            
            let width = size.height / self.size.height * self.size.width
            
            let newImgSize = CGSize(width: width, height: size.height)
            
            UIGraphicsBeginImageContext(newImgSize)
            
            self.draw(in: CGRect(x: 0, y: 0, width: newImgSize.width, height: newImgSize.height))
            
            let theImage = UIGraphicsGetImageFromCurrentImageContext()
            
            UIGraphicsEndImageContext()
            
            guard let newImg = theImage else { return  nil}
            
            return newImg
            
        } else {
            
            let newImgSize = CGSize(width: size.width, height: size.height)
            
            UIGraphicsBeginImageContext(newImgSize)
            
            self.draw(in: CGRect(x: 0, y: 0, width: newImgSize.width, height: newImgSize.height))
            
            let theImage = UIGraphicsGetImageFromCurrentImageContext()
            
            UIGraphicsEndImageContext()
            
            guard let newImg = theImage else { return  nil}
            
            return newImg
        }
    
    }

圖片合成問題補(bǔ)充

1.  合成圖片:由于上傳確認(rèn)頁面的圖片可以點(diǎn)擊進(jìn)去編輯圖片噪叙,或者添加圖片,如果這里每添加一張圖片或者合成一張圖片的話霉翔,會(huì)相當(dāng)?shù)暮馁M(fèi)性能睁蕾,所以合成圖片的操作放在點(diǎn)擊上傳按鈕那里
點(diǎn)擊上傳調(diào)用合成圖片方法,合成圖片方法主要分兩步债朵,實(shí)現(xiàn)思路如下:
(1)創(chuàng)建一個(gè)contentView用來裝多個(gè)ImageView子眶,根據(jù)圖片數(shù)組的數(shù)量for循環(huán)來添加imageview,imageview設(shè)置圖片的時(shí)候先對(duì)圖片進(jìn)行數(shù)據(jù)壓縮處理序芦,然后再對(duì)尺寸進(jìn)行壓縮處理,下面是壓縮處理規(guī)則:
if imagedata.count <  0.8M   {  
不壓縮
} else if imagedata.count >  0.8M && imagedata.count <1M {  
壓縮系數(shù)0.8獲取圖像
} else if imagedata.count >  1M && imagedata.count <2M {  
壓縮系數(shù)0.3獲取圖像
} else {
壓縮系數(shù)0.1獲取圖像
}

壓縮完數(shù)據(jù)以后再進(jìn)行尺寸壓縮
if 圖片寬度>兩倍屏幕寬 || 圖片高度>兩倍屏幕高 {
 圖片大小縮放系數(shù)0.5處理
}
縮放之后設(shè)置到imageView上
(2)通過for循環(huán)來獲取contentView上的imageView上的圖片臭杰,根據(jù)已經(jīng)處理好的image來設(shè)置imageview的frame,排好版面到contentView上芝加,最后就是將contentView轉(zhuǎn)化成image硅卢,并且賦值給合成圖片變量composeImage
以上兩個(gè)for循環(huán)中的內(nèi)容置于autoreleasepool中
整個(gè)上傳流程
點(diǎn)擊上傳 ->進(jìn)入合成圖片方法,顯示正在加載的圈圈藏杖,延時(shí)1.5秒進(jìn)入上傳方法 -> 二分法壓縮圖片數(shù)據(jù)到1M以內(nèi)将塑,圖片大于3張延時(shí)3秒,否則2秒蝌麸,延時(shí)之后執(zhí)行隱藏壓縮圈圈方法点寥,發(fā)起正式上傳網(wǎng)絡(luò)請(qǐng)求 -> 上傳成功之后,圖片變量置為nil,移除圖片數(shù)組元素来吩,返回上一級(jí)敢辩,查看deinit打印執(zhí)行


測(cè)試與分析
6測(cè)試---這里還是之前的合成圖片后,再對(duì)合成圖片壓縮尺寸
如果一進(jìn)入上傳頁面頁面顯示且繪制合成圖片51 -> 61  大概增加10M到150M
五張合成后再縮放圖片:大概增加100 到150M
單獨(dú)測(cè)試壓縮方法  增加大概100M
單獨(dú)測(cè)試壓縮方法加上傳 增加大概110M
縮放圖片尺寸加壓縮 測(cè)試大概增加150M
縮放 壓縮  上傳一氣呵成大概也是增加150M左右
綜上最耗內(nèi)存的兩個(gè)方法 一個(gè)是縮放尺寸(會(huì)進(jìn)行繪制)   一個(gè)是壓縮
大小手機(jī)測(cè)試:
5s 上傳7+拍的5張照片 整個(gè)上傳過程 最高出現(xiàn)增加350M
5s 上傳自己拍的5張  最高出現(xiàn)增加240M   

分析:
1.在幾個(gè)for循環(huán)里面加個(gè)自動(dòng)釋放池感覺沒有緩解什么弟疆,幾M的區(qū)別
2.縮放的的圖片被壓縮成data后戚长,馬上置為nil 整個(gè)上傳過程增加100-130  所以這里有一定的作用
3.  有的圖片的長(zhǎng)寬高達(dá)屏幕的5,6倍怠苔,所以在合成之前同廉,我們可以把每一張圖片縮放一半,后面整張合成的圖片將不再進(jìn)行縮放柑司,經(jīng)測(cè)試這樣合成圖片迫肖,再去上傳圖片,我用5s上傳7+拍的圖片大概增加120M攒驰,相比以前的240蟆湖,350節(jié)約一大半的內(nèi)存,可以有效防止內(nèi)存不足閃退玻粪。

總結(jié):經(jīng)過以上的方法處理隅津,圖片的質(zhì)量和內(nèi)存有了很大的改善诬垂,值得注意的是,我們?cè)谔幚韴D片的時(shí)候饥瓷,一定要注意測(cè)試內(nèi)存剥纷,如果內(nèi)存沒有釋放,將隨著拍攝次數(shù)的增多呢铆,內(nèi)存逐漸增大晦鞋,最后的結(jié)果就是崩潰,可能客戶跟你反饋棺克,你還會(huì)一臉懵逼悠垛,當(dāng)然知道這個(gè)問題就好辦了,這種情況一般是圖片沒有釋放娜谊,或者代碼里有循環(huán)引用所致确买,解決好就可以了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纱皆,一起剝皮案震驚了整個(gè)濱河市湾趾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌派草,老刑警劉巖搀缠,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異近迁,居然都是意外死亡艺普,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門鉴竭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歧譬,“玉大人,你說我怎么就攤上這事搏存」宀剑” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵璧眠,是天一觀的道長(zhǎng)面氓。 經(jīng)常有香客問我,道長(zhǎng)蛆橡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任掘譬,我火速辦了婚禮泰演,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘葱轩。我一直安慰自己睦焕,他們只是感情好藐握,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著垃喊,像睡著了一般猾普。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上本谜,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天初家,我揣著相機(jī)與錄音,去河邊找鬼乌助。 笑死溜在,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的他托。 我是一名探鬼主播掖肋,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼赏参!你這毒婦竟也來了志笼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤把篓,失蹤者是張志新(化名)和其女友劉穎纫溃,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纸俭,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡皇耗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揍很。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郎楼。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖窒悔,靈堂內(nèi)的尸體忽然破棺而出呜袁,到底是詐尸還是另有隱情,我是刑警寧澤简珠,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布阶界,位于F島的核電站,受9級(jí)特大地震影響聋庵,放射性物質(zhì)發(fā)生泄漏膘融。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一祭玉、第九天 我趴在偏房一處隱蔽的房頂上張望氧映。 院中可真熱鬧,春花似錦脱货、人聲如沸岛都。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臼疫。三九已至择份,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烫堤,已是汗流浹背荣赶。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留塔逃,地道東北人讯壶。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像湾盗,于是被迫代替她去往敵國(guó)和親伏蚊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,756評(píng)論 25 707
  • 1格粪、確圖片的壓縮的概念: “壓” 是指文件體積變小躏吊,但是像素?cái)?shù)不變,長(zhǎng)寬尺寸不變帐萎,那么質(zhì)量可能下降比伏。“縮” 是指文...
    HOULI閱讀 18,896評(píng)論 7 34
  • iOS圖片壓縮疆导,想必這是一個(gè)比較大切值得深入的一個(gè)研究赁项。所以太深入的這里我也不會(huì)去講,之所以寫這篇澈段,是因?yàn)槲覀冊(cè)陂_...
    淇水朱華閱讀 14,963評(píng)論 24 46
  • 首先悠菜,我們必須明確圖片的壓縮其實(shí)是兩個(gè)概念: “壓” 是指文件體積變小,但是像素?cái)?shù)不變败富,長(zhǎng)寬尺寸不變悔醋,那么質(zhì)量可能...
    李sir35閱讀 11,613評(píng)論 1 17
  • 有多久芬骄,沒有打開鍵盤去敲打一些文字與心情? 有多久鹦聪,任由自己很多時(shí)候的情緒就那樣流逝账阻,回首已悵然。 人生泽本,總是在這...
    夏知了閱讀 145評(píng)論 0 0