iOS圖片打馬賽克分辨率丟失,圖片編輯完成之后保存原圖分辨率方案法竞,繪畫(huà)時(shí)內(nèi)存暴增導(dǎo)致閃退問(wèn)題
--------終極解決方案
需求是做一個(gè)編輯圖片功能股缸,結(jié)果好不容易各種搜索實(shí)現(xiàn)了功能坐漏,結(jié)果發(fā)現(xiàn)一個(gè)無(wú)解的問(wèn)題苫幢,保存圖片的時(shí)候原圖分辨率丟失了,生成就是用UIGraphicsGetImageFromCurrentImageContext()生成了一張屏幕大小尺寸的圖图张,不用想锋拖,這種方式出來(lái)的圖,分辨率肯定是丟失了的(手機(jī)截圖除外~)祸轮,在網(wǎng)上找了好多大牛寫(xiě)的博客看了好多發(fā)現(xiàn)基本都是這種方法兽埃,很奇怪,難道就沒(méi)人提過(guò)這個(gè)問(wèn)題嗎??
個(gè)人整合了一下代碼适袜,實(shí)現(xiàn)了一種性能和功能都不錯(cuò)的圖片馬賽克編輯器
效果圖:
實(shí)現(xiàn)功能:
- 馬賽克畫(huà)筆功能柄错,可自定義馬賽克圖案 ,馬賽克大小
- 編輯器可放大,放大后雙指移動(dòng)視圖售貌,單指畫(huà)馬賽克
- 上一步给猾,下一步
- 實(shí)現(xiàn)了對(duì)原圖做處理功能,并不是失真保存圖案
- 優(yōu)化了處理時(shí) CPU 占用太高問(wèn)題
?馬賽克畫(huà)筆思路
在實(shí)時(shí)顯示時(shí)候颂跨,使用 CAShapeLayer 與 mask 蒙版的結(jié)合敢伸,達(dá)到馬賽克畫(huà)筆功能,在每一筆畫(huà)完時(shí)候恒削,使用 -drawRect 生成一張?jiān)瓐D片大小的畫(huà)布池颈,在上面摳出馬賽克畫(huà)筆的路徑,然后將馬賽克圖案與原圖融合钓丰,達(dá)到馬賽克效果饶辙。
Q:為什么要生成原圖?
因?yàn)楫?dāng)前實(shí)時(shí)顯示的馬賽克效果,是原圖按比例縮小到屏幕尺寸顯示出來(lái)的斑粱,實(shí)際上,如果需要對(duì)原圖處理脯爪,需要將移動(dòng)路徑點(diǎn)重新乘上縮小的比例则北,那么實(shí)時(shí)顯示的點(diǎn)才是對(duì)應(yīng)原圖上的點(diǎn)
生成的圖,并不是通過(guò)layer渲染的失真縮小圖痕慢,網(wǎng)上馬賽克功能的實(shí)現(xiàn)方式很多錯(cuò)在了這一步尚揣,這也是生成的圖片失真的原因
重點(diǎn): 當(dāng)選擇 A 馬賽克圖案作為畫(huà)筆紋理時(shí)候,其實(shí)就是將馬賽克圖案作為一個(gè) layer 寄宿圖加載出來(lái)掖举,通過(guò)mask蒙版遮住路徑以外的位置快骗,那么看到的是,路徑所顯示馬賽克底圖的路徑了塔次。每次畫(huà)筆畫(huà)完方篮,都會(huì)保存一張每一筆處理完馬賽克與原圖的融合圖,下次替換馬賽克圖案時(shí)候励负,如上面初始化方法藕溅,將上一筆生層融合圖作為原圖,新馬賽克圖案再作為layer继榆,繪制新的馬賽克巾表。
圖層:
使用介紹 和? demo地址:
具體更深層次的實(shí)現(xiàn)原理問(wèn)題,內(nèi)存暴漲原因等略吨,以下文章有非常詳細(xì)的介紹:
http://isylar.com/2018/04/03/iOSMosaiImagePen/
個(gè)人經(jīng)驗(yàn)集币,希望能幫到需要的人,如果老板非要贊賞一下的話翠忠,我不會(huì)拒絕的哦~