效果展示
“我是水印”的文字互例,還有心形氣泡組成的水印。
處理中的動(dòng)態(tài)圖筝闹,上面是進(jìn)度媳叨,下面是文字水印:“我是水印”关顷,動(dòng)態(tài)圖像水雍选:心形氣泡。
核心思路
- 1议双、UIView上面有UILabel(文字水佣环)和UIImageView(圖片水印)平痰,再通過GPUImageUIElement把UIView對(duì)象轉(zhuǎn)換成紋理對(duì)象汞舱,進(jìn)入響應(yīng)鏈;
- 2宗雇、視頻文件的圖像數(shù)據(jù)通過GPUImageMovie進(jìn)入響應(yīng)鏈兵拢;
- 3、GPUImageDissolveBlenderFilter合并水印圖像和視頻逾礁,把數(shù)據(jù)傳給響應(yīng)鏈的終點(diǎn)GPUImageView以顯示到UI和GPUImageMovieWriter以寫入臨時(shí)文件说铃;
- 4访惜、視頻文件的音頻數(shù)據(jù)通過GPUImageMovie傳給GPUImageMovieWriter以寫入臨時(shí)文件;
- 5腻扇、最后臨時(shí)文件通過ALAssetsLibrary寫入系統(tǒng)庫(kù)债热。
具體細(xì)節(jié)
1、GPUImageUIElement
GPUImageUIElement繼承GPUImageOutput類幼苛,作為響應(yīng)鏈的源頭窒篱。通過CoreGraphics把UIView渲染到圖像,并通過glTexImage2D綁定到outputFramebuffer指定的紋理舶沿,最后通知targets紋理就緒墙杯。
2、GPUImageOutput和GPUImageFilter
本次demo主要用到了frameProcessingCompletionBlock屬性括荡,當(dāng)GPUImageFilter渲染完紋理后高镐,會(huì)調(diào)用frameProcessingCompletionBlock回調(diào)。
3畸冲、響應(yīng)鏈解析
- 1嫉髓、當(dāng)GPUImageMovie的紋理就緒時(shí),會(huì)通知GPUImageFilter處理圖像邑闲;
- 2算行、GPUImageFilter會(huì)調(diào)用frameProcessingCompletionBlock回調(diào);
- 3苫耸、GPUImageUIElement在回調(diào)中渲染圖像州邢,紋理就緒后通知
GPUImageDissolveBlendFilter; - 4褪子、frameProcessingCompletionBlock回調(diào)結(jié)束后量淌,通知
GPUImageDissolveBlendFilter紋理就緒; - 5褐筛、GPUImageDissolveBlendFilter收到兩個(gè)紋理后開始渲染,紋理就緒后通知GPUImageMovieWriter叙身;
如圖
總結(jié)
本篇的內(nèi)容與上一篇視頻水印有類似的地方渔扎。GPUImageUIElement是新的知識(shí)點(diǎn),但是如果對(duì)CoreGraphics和OpenGL ES熟悉可以秒懂信轿。
附上代碼
思考題
思考1:響應(yīng)鏈解析中的GPUImageFilter有什么作用晃痴?是否可以去掉?
思考2:frameProcessingCompletionBlock里面需要做什么樣的操作财忽?為什么倘核?
思考3:能否對(duì)圖像水印進(jìn)行復(fù)雜的位置變換?
答案
思考1:目的是每幀回調(diào)即彪;去掉會(huì)導(dǎo)致圖像無法顯示紧唱。
思考2:回調(diào)需要調(diào)用update操作活尊;因?yàn)閡pdate只會(huì)輸出一次紋理信息,只適用于一幀漏益。
思考3:在回調(diào)中對(duì)UIView進(jìn)行操作即可蛹锰;或者使用GPUImageTransformFilter。