GPUImage詳細(xì)解析(四)模糊圖片處理

回顧

解析(一)
解析(二)
解析(三)
這次介紹的GPUImageContextGPUImageFramebufferCacheGPUImagePicture缸濒。

GPUImageContext

GPUImageContext是GPUImage對(duì)OpenGL ES上下文的封裝酵使,添加了GPUImage相關(guān)的上下文驾凶,比如說(shuō)Program的使用緩存浊洞,處理隊(duì)列藻丢,CV紋理緩存等。

1杨帽、屬性介紹

contextQueue 統(tǒng)一處理隊(duì)列
currentShaderProgram 正在使用的program
context OpenGL ES的上下文
coreVideoTextureCache CV紋理緩存
framebufferCache GPUImageBuffer緩存
shaderProgramCache Program的緩存
shaderProgramUsageHistory Program的使用歷史

2漓穿、方法介紹

  • useAsCurrentContext() 在useAsCurrentContext設(shè)置當(dāng)前上下文的時(shí)候,會(huì)先判斷上下文是否是當(dāng)前context注盈,不是再設(shè)置(為了避免上下文切換的性能消耗晃危,即使設(shè)置的上下文是同一個(gè)上下文也會(huì)消耗性能)

  • sizeThatFitsWithinATextureForSize() 會(huì)調(diào)整紋理大小,如果超過(guò)最大的紋理老客,會(huì)調(diào)整為不超過(guò)最大的紋理寬高僚饭。

  • (GLProgram*)programForVertexShaderString:fragmentShaderString:;
    shaderProgramCache 是program的緩存,由頂點(diǎn)shader和片元shader字符串拼接起來(lái)做key胧砰。

  • - (void)useSharegroup:(EAGLSharegroup *)sharegroup;
    EAGLSharegroup類(lèi)管理一個(gè)或者多個(gè)EAGLContext的OpenGLES資源鳍鸵;這個(gè)是一個(gè)封閉的類(lèi),沒(méi)有開(kāi)發(fā)者API尉间。負(fù)責(zé)管理紋理緩存偿乖、頂點(diǎn)緩存、幀緩存哲嘲、顏色緩存贪薪。(textures, buffers, framebuffers, and render buffers)

  • - (EAGLContext *)context;返回OpenGL ES2.0的上下文,同時(shí)設(shè)置glDisable(GL_DEPTH_TEST);撤蚊,圖像處理管道默認(rèn)不允許使用深度緩存古掏。

GPUImageFramebufferCache

GPUImageFramebufferCache是GPUImageFrameBuffer的管理類(lèi)

1、屬性介紹

CacheframebufferCache 緩存字典
framebufferTypeCounts 緩存數(shù)量字典
activeImageCaptureList 正在讀取Image數(shù)據(jù)的GPUImageFrameBuffer列表
framebufferCacheQueue 緩存隊(duì)列

2侦啸、方法介紹

  • - (NSString *)hashForSize: textureOptions:onlyTexture:;
    根據(jù)size槽唾、textureOptions和onlyTexture,創(chuàng)建緩存字符串光涂。
    緩存字符串+當(dāng)前緩存數(shù)量形成framebufferCache緩存的key庞萍。
    如果找不到framebufferCache對(duì)應(yīng)的數(shù)量,會(huì)創(chuàng)建新的緩存忘闻。

  • - (void)returnFramebufferToCache:;回收緩存钝计。根據(jù)size、textureOptions和onlyTexture齐佳,創(chuàng)建緩存字符串私恬,緩存字符串+當(dāng)前緩存數(shù)量形成framebufferCache緩存的key。(之所以會(huì)加上數(shù)量炼吴,是因?yàn)榫彺孀址晃ㄒ唬?/p>

  • - (void)addFramebufferToActiveImageCaptureList:;
    - (void)removeFramebufferFromActiveImageCaptureList:
    這兩個(gè)方法主要用于本鸣,當(dāng)newCGImageFromFramebufferContents()讀取幀緩存圖像數(shù)據(jù)時(shí),保持GPUImageFramebuffer的引用硅蹦。并且讀取完數(shù)據(jù)后荣德,在dataProviderUnlockCallback()方法釋放闷煤。

GPUImagePicture

GPUImagePicture是PGUImage的圖像處理類(lèi),繼承GPUImageOutput涮瞻,一般作為響應(yīng)鏈的源頭鲤拿。

1、屬性介紹

pixelSizeOfImage 圖像的像素大小署咽。
hasProcessedImage 圖像是否已處理近顷。
imageUpdateSemaphore 圖像處理的GCD信號(hào)量。

2艇抠、方法介紹

  • - (id)initWithCGImage:smoothlyScaleOutput: 用源圖像newImageSource和是否采用mipmaps來(lái)初始化GPUImagePicture幕庐。
    如果圖像大小超過(guò)OpenGL ES最大紋理寬高久锥,或者使用mipmaps家淤,或者圖像數(shù)據(jù)是浮點(diǎn)型、顏色空間不對(duì)等都會(huì)采用CoreGraphics重新繪制圖像瑟由。
    然后通過(guò)glTexImage2D把圖像數(shù)據(jù)發(fā)送給GPU絮重,最后釋放掉CPU的圖像數(shù)據(jù)。

  • - (BOOL)processImageWithCompletionHandler:; 通知targets處理圖像歹苦,并在完成后調(diào)用complete代碼塊青伤。在處理開(kāi)始時(shí),會(huì)標(biāo)記hasProcessedImage為YES殴瘦,并調(diào)用dispatch_semaphore_wait()狠角,確定上次處理已經(jīng)完成,否則取消這次處理蚪腋。

  • - (void)addTarget: atTextureLocation:;添加target到響應(yīng)鏈丰歌。如果hasProcessedImage為YES,表示圖像已經(jīng)處理完畢屉凯,直接設(shè)置targets的InputSize立帖,并調(diào)用newFrameReadyAtTime()通知target。

DEMO

用GPUImagePicture處理源圖像悠砚,用GPUImageTiltShiftFilter處理模糊效果晓勇,用GPUImageView顯示。

效果展示

核心代碼

將GPUImageView設(shè)置為self.view灌旧,根據(jù)face.png绑咱,設(shè)置GPUImagePicture,然后添加GPUImageTiltShiftFilter到響應(yīng)鏈枢泰,再把GPUImageView作為響應(yīng)鏈的終點(diǎn)描融,最后調(diào)用processImage,開(kāi)始處理圖像宗苍。

    GPUImageView *primaryView = [[GPUImageView alloc] initWithFrame:self.view.frame];
    self.view = primaryView;
    UIImage *inputImage = [UIImage imageNamed:@"face.png"];
    _sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage];
    _sepiaFilter = [[GPUImageTiltShiftFilter alloc] init];
    _sepiaFilter.blurRadiusInPixels = 40.0;
    [_sepiaFilter forceProcessingAtSize:primaryView.sizeInPixels];
    [_sourcePicture addTarget:_sepiaFilter];
    [_sepiaFilter addTarget:primaryView];
    [_sourcePicture processImage];

總結(jié)

最近因?yàn)橹辈ビ脩?hù)增長(zhǎng)太快稼稿,忙著優(yōu)化原來(lái)的邏輯薄榛,研讀源代碼的時(shí)間變少。
同時(shí)為了寫(xiě)這篇文章让歼,查了一些關(guān)于圖像資料敞恋,末尾附上。
下一篇文章可能會(huì)介紹今年大火的直播APP的一種速成方案谋右,也可能會(huì)是GPUImageMovie的介紹硬猫。
喜歡的點(diǎn)一下關(guān)注,不迷路改执。

MIPMAP

Mipmap紋理技術(shù)是目前解決紋理分辨率與視點(diǎn)距離關(guān)系的最有效途徑,它會(huì)先將圖片壓縮成很多逐漸縮小的圖片,例如一張6464的圖片,會(huì)產(chǎn)生6464,3232,1616,88,44,22,11的7張圖片,當(dāng)屏幕上需要繪制像素點(diǎn)為2020 時(shí)啸蜜,程序只是利用 3232 和 1616 這兩張圖片來(lái)計(jì)算出即將顯示為 2020 大小的一個(gè)圖片,這比單獨(dú)利用 32*32 的那張?jiān)计?jì)算出來(lái)的圖片效果要好得多辈挂,速度也更快.

圖像數(shù)據(jù)格式

kCGImageAlphaLast:alpha 分量存儲(chǔ)在每個(gè)像素中的低位衬横,如RGBA。
kCGImageAlphaFirst:alpha 分量存儲(chǔ)在每個(gè)像素中的高位终蒂,如ARGB蜂林。
kCGImageAlphaPremultipliedLast:alpha 分量存儲(chǔ)在每個(gè)像素中的低位,同時(shí)顏色分量已經(jīng)乘以了 alpha 值拇泣。
kCGImageAlphaPremultipliedFirst:alpha 分量存儲(chǔ)在每個(gè)像素中的高位噪叙,同時(shí)顏色分量已經(jīng)乘以了 alpha 值。
kCGImageAlphaNoneSkipLast:沒(méi)有 alpha 分量霉翔。如果像素的總大小大于顏色空間中顏色分量數(shù)目所需要的空間睁蕾,則低位將被忽略。
kCGImageAlphaNoneSkipFirst:沒(méi)有 alpha 分量债朵。如果像素的總大小大于顏色空間中顏色分量數(shù)目所需要的空間子眶,則高位將被忽略。

圖像顏色空間

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末葱弟,一起剝皮案震驚了整個(gè)濱河市壹店,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芝加,老刑警劉巖硅卢,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異藏杖,居然都是意外死亡将塑,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)蝌麸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)点寥,“玉大人,你說(shuō)我怎么就攤上這事来吩「冶纾” “怎么了蔽莱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)戚长。 經(jīng)常有香客問(wèn)我盗冷,道長(zhǎng),這世上最難降的妖魔是什么同廉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任仪糖,我火速辦了婚禮,結(jié)果婚禮上迫肖,老公的妹妹穿的比我還像新娘锅劝。我一直安慰自己,他們只是感情好蟆湖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布故爵。 她就那樣靜靜地躺著,像睡著了一般帐姻。 火紅的嫁衣襯著肌膚如雪稠集。 梳的紋絲不亂的頭發(fā)上奶段,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天饥瓷,我揣著相機(jī)與錄音,去河邊找鬼痹籍。 笑死呢铆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹲缠。 我是一名探鬼主播棺克,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼线定!你這毒婦竟也來(lái)了娜谊?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤斤讥,失蹤者是張志新(化名)和其女友劉穎纱皆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體芭商,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡派草,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铛楣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片近迁。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖簸州,靈堂內(nèi)的尸體忽然破棺而出鉴竭,到底是詐尸還是另有隱情歧譬,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布搏存,位于F島的核電站缴罗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏祭埂。R本人自食惡果不足惜面氓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蛆橡。 院中可真熱鬧舌界,春花似錦、人聲如沸泰演。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)睦焕。三九已至藐握,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間垃喊,已是汗流浹背猾普。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留本谜,地道東北人初家。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像乌助,于是被迫代替她去往敵國(guó)和親溜在。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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