欧美vvv,亚洲第一成人在线,亚洲成人欧美日韩在线观看,日本猛少妇猛色XXXXX猛叫

新聞資訊

    本文由作者授權發布。

    如果你想了解如何封裝一個高斯模糊,可以參考之前的文章:

    如何封裝個好用的高斯模糊組件

    本文作者給大家分享了一個自己在制作高斯模糊效果時,遇到的問題以及分析的思路。

    高斯模糊的UI效果相信大家多多少少都有接觸過,只是可能并沒有真正在實際項目中去使用過,這次產品需求中正好涉及到了高斯模糊的展示效果,隨便去研究了下這塊東西,先上一個最終的效果圖。

    實際真機效果還是流暢的,錄屏出來有點卡頓的感覺。

    從效果還是可以看出,當點擊簽到按鈕的時候,會伴隨簽到頁面和分享按鈕的自下向上的彈出效果,這個動畫直接使用屬性動畫就能實現沒什么好說的,最主要的就是后面的高斯模糊效果,仔細看的話可以發現是有一個從清晰逐漸模糊的漸變效果,這個不是本文重點,這里想說的是在實現自定義高斯模糊效果的時候自己所遇到的一個坑。

    1

    基礎知識

    實際上高斯模糊效果本身是沒什么好說的,只要你去網上搜索一下相信能找到不少相關的實現,其中對于開發來說最主要的實現方法就是使用方法去實現,自己實現模糊效果的時候也是參考這些代碼來完成。

    寫這篇文章主要不是來說高斯模糊是如何實現,而是想把自己在實現這個高斯模糊效果中遇到的一個大坑和大家分享下,這個坑大家不一定遇到到,尤其是從直接找一個現成的高斯模糊控件,通過看源碼幾乎不可能發現這個大坑,只有真正去實現過這個效果的人才有可能發現這個問題,很明顯自己就屬于后者,還正巧踩到了這個坑上,這里就說下自己踩坑埋坑的心路歷程。

    高斯模糊實現思路

    還是簡單說下高斯模糊實現的簡單思路,就是得到原圖然后通過處理獲取到模糊后的,自定義的view在中去draw該。思路就是這么簡單,這里說下需要注意的幾個點。

    (1)如何得到模糊后的,這個就是通過來實現的,模板代碼如下:

    //創建一個縮小后的

    = .(image, width, , false);

    //創建將在中使用到的經過模糊處理后的

    = .();

    什么app上有高斯模糊_ps用高斯模糊磨皮_高斯模糊算法

    //創建,固定寫法

    rs = .();

    blur = .(rs, .U8_4(rs));

    //根據,分別分配內存

    tmpIn = .(rs, );

    = .(rs, );

    //設置模糊半徑取值0-25之間,不同半徑得到的模糊效果不同

    blur.( 15);

    blur.(tmpIn);

    blur. ();

    //得到最終的模糊

    .();

    高斯模糊的核心代碼差不多都是這樣大同小異,上述代碼需要注意一下的有三個地方:

    1. blur.參數取值在0-25之前,超過這個范圍程序會崩潰掉

    2. ,,這些類需要使用v8中的類,所以需要在你的build.加入以下配置

    {

    高斯模糊算法_ps用高斯模糊磨皮_什么app上有高斯模糊

    27

    1

    "1.0"

    19

    bled true

    }

    3 巧妙得到“原圖”,高斯模糊就是通過對原圖處理得到一張模糊圖,但是這里所說的原圖并不是真正意義上的原圖,聽著有點拗口.

    舉個簡單的列子,比如你想對一個大小的進行高斯模糊處理,得到該后還需要對該原圖進一步壓縮得到一張例如大小的圖.

    為什么要這么做呢,其實最主要的原因還是因為高斯模糊處理過程本身就比較消耗性能,所以說理論上你處理的原圖分辨率越小那么消耗時間也就越少,對原圖進行壓縮處理,主要就是考慮到性能上的問題,尤其是當你的app需要支持動態高斯模糊效果的時候,需要不停的去得到模糊的,如果每次的處理量都很大就會造成頁面卡頓的問題,所以使用壓縮后的原圖優勢顯而易見,另一個原因就是高斯模糊得到的最終就是模糊的效果,原圖壓縮失真對最后的結果并沒有太大的影響。

    明白了上面的道理那么高斯模糊的模板代碼你也就掌握了。

    2

    處理模糊效果

    先來看下具體效果,如圖原圖如下

    使用上述代碼處理后可以得到如下效果

    看起來效果還是不錯的吧,修改 blur.(15);的參數可以得到不同模糊效果的展示,關于原圖的如何得到可以直接通過view.draw方法得到,簡單粗暴,如果你的高斯模糊只是用來處理就可以的話那么關于我說的那個坑你是不會遇到的。

    高斯模糊算法_ps用高斯模糊磨皮_什么app上有高斯模糊

    3

    遇坑:處理整個屏幕的模糊效果

    這才是可能會遇到坑的地方,如果你想模糊的是整個屏幕,就如我文章開頭的那種效果,那么這個坑會弄得你暈頭轉向,至少我開始看到呈現出來的效果時真的就是一臉懵逼,先來看一下沒有模糊時的布局demo

    布局代碼就不貼了,有點長,花點時間完全可以弄一個類似的出來什么app上有高斯模糊,這里說一下我對該布局模糊的整體思路,首先得到布局文件中的根布局main,這里使用的是一個 ,通過調用的draw方法得到,對該壓縮后得到二次原圖,最后通過處理得到模糊的并在方法中繪制出來。

    根據以上思路我預期得到的效果圖應該長這樣才對

    然而實際效果卻是這樣的

    看起來似乎一樣,但是仔細對比一下就能發現上面的那張圖片似乎只是經過了半模糊的處理,邊緣部分還是清晰可見,這顯然不是我想要的效果。

    4

    填坑過程

    為什么會造成這種問題什么app上有高斯模糊,當你模糊一個的時候效果非常完美,而當你去模糊一個的時候就出現上述詭異問題,起初是懷疑和圖片有關,于是換了一張其他圖片發現結果還是這樣。

    然后排查代碼檢查代碼邏輯是否有問題,這是一個比較漫長的過程把可能引起問題的代碼注釋重新運行,最后折騰了半天發現并沒有任何卵用。

    圖片沒問題,代碼看起來也似乎沒有問題那到底是哪里出了問題,無奈只好網上搜相關問題,只能說網絡這么大可惜沒有我想要的答案。

    不過從網上的一些文章也算間接找到可能解決的方案,去上找一個高斯模糊的控件,將該控件應用到我的布局上去,然后奇跡發生了,居然沒有發生邊緣清晰的異常,這只能說明是我自己的代碼有問題才會導致這個問題,剩下的問題就是排查到底是什么代碼引起的這個詭異問題。

    這里說一句題外話為什么不直接使用上的開源庫,而是自己重新造輪子。

    高斯模糊算法_什么app上有高斯模糊_ps用高斯模糊磨皮

    第一上的開源庫不能完全滿足需求即使使用也要進行二次開發,耗費的時間成本可能比自己寫還要多。

    第二高斯模糊本身模板代碼不復雜完全可以自己自定義。

    第三很多人都喜歡說不要重復造輪子,但我想說的是你也要有這個本事去造這個輪子,更多的時候給你這個時間你都不一定有本事造成這個輪子才是主要原因,很多人只不過是個代碼的搬運工而已,有個類似效果就直接拿到用也不去研究下如何實現。

    回到問題本身,又是半天的摸索,經過大量對比終于將可疑點定位到了一個關鍵的地方,我自己代碼中是通過得到你要模糊的view,然后調用該view的draw方法得到,而上的高斯模糊控件是通過的draw方法得到,當我將自己的高斯模糊控件對應邏輯改成之后,整個世界都清凈了,我得到了和一樣的高斯模糊效果,那一刻可以說困擾了我兩天的問題終于得到了解決,這種成就感不是單單使用一個開源庫所能得到的。

    為什么??

    開心沒有多久,一個巨大的疑問又讓我感到郁悶,為什么使用就沒問題,而使用其他就會出問題,可能猜測到的原因就是內部做了什么操作,但是做了什么操作,面對這么多的代碼可以說真的就是無從下手去找,猜測的第一個原因是不是和硬件加速有關,測試后發現并沒有用處,繼續懵逼中......,換幾張圖片看看能不能發現一點蛛絲馬跡,以下效果引起了我注意

    上述效果是我調用布局中的根view的draw方法得到的模糊效果,可以發現一個奇怪的地方,似乎箭頭模糊后原圖懸浮到了模糊效果之上,為了驗證猜測我在自定義高斯模糊的方法中繪制了一個白色的背景,如果原圖懸浮在高斯模糊自定義控件之上的話那么將會出現白色背景不能覆蓋原圖的現象,反之白色背景將會遮蓋掉原圖。

    運行看了下效果,真可謂無心插柳柳成蔭,運行后的效果居然變成了:

    這不正是我想要的最終效果嗎!!

    在給自定義高斯模糊控件設置一個白色背景居然就解決了困擾我兩天的難題,接下來就是思考為什么這種方法是可行的,一個非常合理的解釋就是如圖所示:

    原來的布局中紅框圈起來的部分是沒有背景色的,高斯模糊在處理模糊效果的時候將圖中圓圈內部邊緣的顏色值和圓圈外部的透明色進行處理最終得到的顏色值不變,這樣就產生了一種邊緣清晰可見的視覺效果,如圖所示:

    到此才可以說算是找到了導致我自定義高斯模糊效果異常的真正原因。

    什么時候設置背景色

    高斯模糊算法_什么app上有高斯模糊_ps用高斯模糊磨皮

    最后一個困擾我的問題,為什么調用的draw方法就沒問題,經過上述我總結的原因,唯一一個解釋就是默認自帶一個背景色!!

    那么這個背景色是在什么時候設置的呢,只能在源碼里面去找答案了,這次就不再是大海撈針的看源碼了,在--》--》方法中最終找到了我想要的答案:

    a = ();

    ...

    if( == 0) {

    = a.(

    R..und, 0);

    }

    ...

    final ;

    if( != 0) {

    = ().();

    } else{

    = ;

    }

    .();

    關鍵代碼都已經給出,可以看到最終調用了設置了一個背景色!!,到此所有的疑問都得到了非常完美的解答。

    總結

    總結下自定義高斯模糊所遇到的問題,由于可能存在沒有默認背景色的緣故,導致會發現模糊后的效果比較詭異的情況,而默認在生成的時候就自帶背景色所以使用來實現高斯模糊不會出現問題,文章重點不是在說如何實現高斯模糊效果,而是解決問題的一個思路。

    PS:有不少同學,通過這篇擁抱開發的變化,才能擁抱未來文章購買了紹文的課程,已經更新2講了,記得學習和實踐 上的課后作業,我會不定期提醒的。返回搜狐,查看更多

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有