最近工作之餘在做乙個美圖秀秀的仿品 做到濾鏡這塊的時候 自己就參考了網上幾位博主(名字忘了記,非常抱歉)的部落格,但是發現跟著他們的demo做的濾鏡處理,都會有很嚴重的記憶體洩漏,於是就自己按照大體的思路將**重新整理了下,並解決了記憶體洩漏問題。
大體思路如下:
根據建立乙個coregraphic的圖形上文->根據圖形上下文獲取每個畫素的rgba的色值陣列->遍歷陣列,按照顏色矩陣進行像素色值調整->輸出繪製新的
具體流程如下:
首先建立乙個rgba通道位圖上下文:注意在以下方法中,不要立刻釋放malloc方法生成的bitmapdata記憶體空間指標,(可能有的朋友覺得已經把記憶體空間位址給了點陣圖上下文就可以立馬釋放掉了,但是由於位圖上下文在後來的影象渲染時,仍然需要這一塊記憶體,因此不能在此處立馬釋放掉記憶體,之前拜讀的幾篇部落格索性就不釋放記憶體了,因此會導致記憶體洩漏,處理一些高畫質影象時,手機記憶體會輕易飆公升到1g以上,而導致程式掛掉)不然會導致位圖上下文的內容資料不能正常存在而導致生成失敗,在這裡需要乙個全域性記憶體指標來指向它,並且在合適的時候釋放記憶體,具體看如下**:
建立rgba通道位圖上下文:該位圖上下文主要提供了乙個畫板,配置了畫板的繪圖所占用的位元組數,裝置依賴的rgb通道等資訊。該上下文主要用於提供所有渲染影象的畫素的rgba值陣列,以便後續對畫素值的遍歷處理。
#pragma mark---------------------------------------->建立乙個使用rgba通道的點陣圖上下文返回目標影象的rbga像素色值的陣列指標:該指標指向乙個陣列,陣列中的每四個元素都是影象上的乙個畫素點的rgba的數值(0-255),用無符號的char是因為它正好的取值範圍就是0-255staticcgcontextref creatergbabitmapcontex(cgimageref inimage)
static unsigned char *requestimagepixeldata(uiimage *inimage),};將乙個畫素rgba值陣列通過乙個顏色矩陣進行轉換:顏色矩陣決定了影象的渲染效果,因此不同的濾鏡效果可以通過設定不同的顏色矩陣進行轉換。如果不懂顏色矩陣,可以參考如下的部落格:在這裡就不過多描述了。//將目標影象繪製到指定的上下文,實際為上下文內的bitmapdata。
cgcontextdrawimage(cgctx, rect, img);
unsigned char *data =cgbitmapcontextgetdata(cgctx);
//釋放上面的函式建立的上下文
cgcontextrelease(cgctx);
cgctx =null;
returndata;
}
注意:在以下方法中,建議先取值並賦值給變數,因為每個畫素點的色值,都要呼叫這個方法,對於一張稍大的高畫質圖,會遍歷非常多的次數,因此,裡面的每一步多餘的操作,都會引起積累起來的長時間處理,博主當時也踩了這個坑,導致處理一張時極度耗時。
static void changergb(int *red,int* green,int*blue,int*alpha ,const float *f)以下方法就是暴露給大家的最終處理方法了,通過傳入一張和乙個顏色矩陣f,即可完成一張的濾鏡渲染,並且,在生成一張後,最好是將該影象轉換為nsdata型別進行儲存,然後釋放掉之前全域性變數記憶體指標,最後再將nsdata資料回傳給需要的方法。如果不將生成影象轉化為nsdata儲存,而直接使用生成的uiimage物件,則在釋放掉記憶體指標後,uiimage物件也將不存在,樓主親測,是個大坑,讀者盡量避免此類情況。if (*red>255)
if (*green<0)
if (*green>255)
if (*blue<0)
if (*blue>255)
if (*alpha>255)
if (*alpha<0)
}
- (uiimage *)createimagewithimage:(uiimage *)inimage andcolormatrix:(const float *)fdemo的操作很簡單,即動態改變顏色矩陣的值,實時生成渲染,您可以慢慢除錯,如果發現您喜歡的渲染型別,直接點選儲存,xcode即可列印乙個完整的顏色矩陣,您只需要將顏色矩陣儲存,就擁有了獨一無二的濾鏡哦。woff += w * 4;
}nsinteger datalength = w * h * 4;
//建立要輸出的影象的相關引數
cgdataproviderref provider =cgdataprovidercreatewithdata(null, imgpixel, datalength, null);
if (!provider) elseelse
return[uiimage imagewithdata:data];}}
returnnil;
}
iOS 記憶體洩漏排查以及處理
第一步 開啟xcode7自帶的instruments 或者 按上面操作,build成功後跳出instruments工具,選擇leaks選項 選擇之後介面如下圖 到這裡之後,我們前期的準備工作做完啦,下面開始正式的測試 1.選中xcode先把程式 command r 執行起來 2.再選中xcode,按...
iOS記憶體洩漏檢測及分析
我們知道,ios開發中對記憶體管理的要求非常嚴格,一旦存在記憶體洩漏,後果是非常嚴重的,會導致程式非常容易崩潰。儘管目前ios開發基本上都是採用的arc方式進行記憶體管理,但是一不小心就會存在記憶體洩漏的問題。首先,我們需要定位記憶體洩漏的問題,目前比較常用的記憶體洩漏的排查方法有兩種,都在xcod...
js中的資料和記憶體及相關問題
1.資料 儲存在記憶體中代表特定資訊的 東西 特點 可傳遞 可運算 記憶體中所有操作的目標 資料 2.變數 變數就是在程式執行過程中它的值允許改變的量,由變數名和變數值組成 每個變數都對應一小塊記憶體,變數名用來查詢對應的記憶體,變數值就是記憶體中儲存的資料 3.記憶體 記憶體是指記憶體條通電後產生...