重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
Android Paint之顏色過濾器
專業領域包括成都網站設計、做網站、商城網站定制開發、微信營銷、系統平臺開發, 與其他網站設計及系統開發公司不同,成都創新互聯公司的整合解決方案結合了幫做網絡品牌建設經驗和互聯網整合營銷的理念,并將策略和執行緊密結合,為客戶提供全網互聯網整合方案。
Paint之shader(圖像渲染)
Paint之PathEffect(路徑效果)
Paint API之—— MaskFilter(面具)
android之繪圖工具類詳解
Paint API之—— Xfermode與PorterDuff全面詳解
Paint API之—— Xfermode與PorterDuff詳解(三)動畫效果
Paint枚舉、常量值、陰影效果、字體
上節我們學習了MaskFilter(面具),用它的兩個子類BlurMaskFilter弄了下模糊效果,EmbossMaskFilter 弄了下浮雕效果,而本節我們來學習的是另一個API—— ColorFilter (顏色過濾器),和MaskFilter一樣, 我們并不直接使用該類,而是使用該類的三個子類:
本節我們就來學習下第一個ColorMatrixColorFilter的使用吧,打開ColorMatrixColorFilter的文檔,
大概說的是:通過一個4 x 5的顏色矩陣來變換顏色,可以修改像素的飽和度,將YUV轉換成RGB等! 而構造方法中的ColorMatrix就是顏色矩陣,也是我們學習的核心,下面聽我一一道來!
RGBA不知道你聽過沒,黃綠藍知道了吧,光的三基色,而RAGB則是在此的基礎上多了一個透明度! R(Red紅色) , G(Green綠色) , B(Blue藍色) , A(Alpha透明度) ;另外要和顏料的三 原色區分開來哦,最明顯的區別就是顏料的三原色中用黃色替換了光三基色中的綠色!知道下就好, 有興趣的可自行百度~
中文直譯為“色彩矩陣顏色過濾器”,我們要先了解什么是色彩矩陣。在Android中圖片是以RGBA像素點的形式加載到內存中的,修改這些像素信息需要一個叫做ColorMatrix類的支持,這個類其實定義的是一個矩陣,是一個4x5的float[]類型的矩陣:
其中,第一行表示的R(紅色)的向量,第二行表示的G(綠色)的向量,第三行表示的B(藍色)的向量,最后一行表示A(透明度)的向量,這一順序必須要正確不能混淆!你可能會問,那么列呢?我用圖例來表示一下。
這個矩陣不同的位置表示的R、G、B、A值,其范圍在0.0F至2.0F之間,1為保持原圖的RGB值。每一行的第五列數字表示”偏移值“。
何為偏移值?顧名思義當我們想讓顏色更傾向于紅色的時候就增大R向量中的偏移值,想讓顏色更傾向于藍色的時候就增大B向量中的偏移值,這是最最樸素的理解,但是事實上色彩偏移的概念是基于白平衡來理解的。
什么是白平衡呢?說得簡單點就是白色是什么顏色!在單反的設置參數中有個色彩偏移,其定義的就是白平衡的色彩偏移值,就是當你去拍一張照片的時候白色是什么顏色的,在正常情況下白色是(255, 255, 255, 255)但是“現實世界中我們是無法找到這樣的純白物體的”,所以在我們用單反拍照之前就會拿一個我們認為是白色的物體讓相機記錄這個物體的顏色作為白色,然后拍攝時整張照片的顏色都會依據這個定義的白色來偏移!而這個我們定義的“白色”(比如:255, 253, 251, 247)和純白(255, 255, 255, 255)之間的偏移值(0, 2, 4, 8)我們稱之為白平衡的色彩偏移。
測試一下:
我們想要繪制一個橙色的圓圈,橙色的效果如下:
我們建立一個矩陣,然后看看效果。
看看效果:
你會發現顏色沒有任何變化,為什么呢?因為矩陣的1表示不做任何變化,也就是保持原樣。我們換一個下面的矩陣就能看到效果了。
說明:如果在eclipse實時預覽的話,它會提示說如果你設置了這個屬性,那么eclipse可能無法準確的給你一個預覽圖。別擔心,實際運行的時候就出來了。
我們來看看這個矩陣是怎么計算的。其實說白了就是矩陣之間的運算乘積:
矩陣ColorMatrix的一行乘以矩陣MyColor的一列作為矩陣Result的一行,這里MyColor的RGBA值我們需要轉換為[0, 1]。通過這種計算我們可以將我們自己設定的顏色和矩陣的顏色進行疊加,創立一個新的顏色。
再測試一下:
如果我們用它來給圖片改顏色,該怎么做呢?下面的例子將會演示一下。
原本圖片:
加上濾鏡后:
現在我們知道了,ColorMatrixColorFilter和ColorMatrix就是這么個東西,ColorMatrix類里面也提供了一些實在的方法,比如setSaturation(float sat)設置飽和度,而且ColorMatrix每個方法都用了陣列的計算,如果大家感興趣可以自己去深挖。
顧名思義光照顏色過濾,這肯定是跟光照是有關的了。該類有且只有一個構造方法:
mul全稱是colorMultiply意為色彩倍增,而add全稱是colorAdd意為色彩添加,這兩個值都是16進制的色彩值0xAARRGGBB。這個方法使用也是非常的簡單。還是拿上面那張圖片來說吧,比如我們想要去掉綠色:
運行后你會發現綠色確實是沒了但是原來偏綠的部分現在居然成了紅色,當LightingColorFilter(0xFFFFFFFF, 0x00000000)的時候原圖是不會有任何改變的,如果我們想增加紅色的值,那么LightingColorFilter(0xFFFFFFFF, 0x00XX0000)就好,其中XX取值為00至FF。
PorterDuffColorFilter跟LightingColorFilter一樣,只有一個構造方法:
這個構造方法也接受兩個值,一個是16進制表示的顏色值這個很好理解,而另一個是PorterDuff內部類Mode中的一個常量值,這個值表示混合模式。那么什么是混合模式呢?混合混合必定是有兩種東西混才行,第一種就是我們設置的color值而第二種當然就是我們畫布上的元素了!也就是說將畫布上的元素和我們設置的color進行混合,產生最終的效果。
你可以類比為PS中的混合模式,只是PS的圖層混合模式比Android更多更廣泛,但兩者同名混合模式所產生的效果是一樣的,也基于同樣的算法原理這里就不多說了。
但是這里要注意一點,PorterDuff.Mode中的模式不僅僅是應用于圖像色彩混合,還應用于圖形混合,比如PorterDuff.Mode.DST_OUT就表示裁剪混合圖。
上一章加載圖片的過程,在這里就不做贅述。
之前我們通過YUV數據格式的處理知道,只要保留Y的數據,就是灰度的圖片。但是OpenGL中處理的是RGB格式的數據,我們要如何去取得灰度圖呢?
我們可以通過公式,計算出新的RGB值,就是灰度的圖片了。
我們的目標已經確定。下面我們需要將片段著色器上的每個像素的RGB值,通過上面的公式計算,裝換成我們的灰度值。
根據上面的思路,我們需要去改片元著色器。 texture_fragment_shader.glsl
對比之前的,需要是有如下的修改點:
按照之前的想法,我們需要將我們的公式中的系數傳遞進入,就可以完成我們的操作了?;谥暗恼J識,我們知道傳遞我們的屬性 uniform 給OpenGL的都是通過創建數組,綁定屬性,這一套流程。
與上面的黑白色的處理相似,冷色調的處理就是單一增加藍色通道的值,暖色調的處理可以增加紅綠通道的值。
不管是冷色還是暖色。每個像素的顏色都和我們傳入的色值相加,產生偏置之后的顏色。同時還要確保顏色的值合法。如果超過最大,或者小于最小,就用極限值表示。
還是之前的套路。
紅黃通道增加的結果
藍色通道增加的結果
圖片模糊處理相對上面的色調處理稍微復雜一點,通常圖片模糊處理是采集周邊多個點,
然后利用這些點的色彩和這個點自身的色彩進行計算,得到一個新的色彩值作為目標色彩。
模糊處理有很多算法,類似高斯模糊、徑向模糊等等。
最常用的還是高斯模糊。先看一下高斯模糊的原理。
使用正態分布作為權重分配模式,對周圍像素取平均值的方式,就是高斯模糊。
在圖形上,正態分布是一種鐘形曲線,越接近中心,取值越大,越遠離中心,取值越小。
計算平均值的時候,我們只需要將"中心點"作為原點,其他點按照其在正態曲線上的位置,分配權重,就可以得到一個加權平均值。
上面的正態分布是一維的,圖像都是二維的,所以我們需要二維的正態分布。
二維高斯函數:
有了這個函數 ,就可以計算每個點的權重了。
為了計算權重矩陣,需要設定σ的值。假定σ=1.5,則 模糊半徑為1 的權重矩陣,權重之和等于1,得到最終的權重矩陣。
對所有點重復這個過程,就得到了高斯模糊后的圖像。如果原圖是彩色圖片,可以對RGB三個通道分別做高斯模糊。
如果一個點處于邊界,周邊沒有足夠的點,怎么辦?
一個變通方法,就是把已有的點拷貝到另一面的對應位置,模擬出完整的矩陣。
上面著色器。我們是計算好了卷積核,直接在 shader 內寫死應用的。
這一小節的內容耗時比較長。其實就是利用OpenGL的shader對圖像進行簡單的濾鏡處理。
從這節我們學習到
下一章,會回到Android的內容。將OpenGl和Camera結合在一起。通過OpenGl來顯示一個預覽的畫面。
我覺得安卓系統值得推薦的濾鏡app有激萌相機,快拍,美圖秀秀等等。這些app都帶有比較全面的濾鏡,而且,相對來說質量都比較高,其實是新手也能拍出時尚大片的感覺。說道美顏和濾鏡,我覺得愛拍是最強大的,可以將你完全變成另一個人,它有多種調節方式,有無極調光和柔光三色不管是直播還是拍攝,都能起到很好的效果,就像是愛拍上的一個男博主,利用美顏和濾鏡把自己變成一個很好看的女生一樣。
1、Mix濾鏡大師。
IX濾鏡大師免費提供將近200款默認濾鏡,包括景深濾鏡,散景濾鏡,經典紋理,漏光濾鏡,更多自定義編輯工具和完善的自定義編輯參數。MIX濾鏡大師是一款自定義手動編輯應用,在創造的過程中,能滿足對照片的想象。
2、光影魔術手。
光影魔術手為一款針對圖像畫質進行改善提升及效果處理的軟件;簡單、易用,不需要任何專業的圖像技術,就可以制作出專業膠片攝影的色彩效果,其具有許多獨特之處,如反轉片效果、黑白效果、數碼補光、沖版排版等,且其批量處理功能非常強大,是攝影作品后期處理、圖片快速美容、數碼照片沖印整理時必備的圖像處理軟件,能夠滿足絕大部分人照片后期處理的需要。
3、美圖秀秀。
美圖秀秀的圖片特效、美容、拼圖、場景、邊框、飾品等功能,可以1分鐘做出影樓級照片,還能一鍵分享到新浪微博、人人網、QQ空間等。
2018年4月推出美圖社交圈,鼓勵年輕人秀真我,讓社交更好看,美圖秀秀也從影像工具升級為社區平臺。
4、百度魔圖。
百度魔圖(原魔圖精靈)是Beijing Baidu Netcom Science Technology Co.,Ltd開發的一款掌上美圖工具,致力于提供手機上圖片拍攝、美化、分享和云端相冊的一站式圖片服務。
調節亮度、對比度、裁剪、旋轉翻轉圖片等等,對圖片基本的色彩校正和技術處理。采用后臺曲線調節技術,用戶拖動滑桿即可達到。支持iOS及Android系統,已成為時下最流行的圖片美化工具。
5、可牛影像。
可牛影像為一款強大的免費照片處理管理軟件??膳S跋駜惹渡锨埲諝v、寶寶照、大頭貼、婚紗照、非主流場景,無須任何PS技巧識即可輕松制作支持多圖場景,一張日歷、婚紗、寶寶照中可內嵌多張照片,制作效果很酷。軟件集成了超強人像美容及影樓特效智能人像柔焦美容,1秒鐘呈現朦朧藝術感覺,像冷藍、冷綠、暖黃、復古四大影樓特效,冷艷、唯美、風情。
廢話少說,先舉個例子
這個例子其實在 android端使用ffmpeg給視頻添加圖片水印 里已經說過了。
這是一個給視頻打上圖片水印的命令。
然而,他打的不是一個普通的水印,而是兩個。
命令看上去很簡潔。然而(又是然而),正因為他這么簡潔,所以一開始上來未免搞不清他實際是什么意思。
來,我們把他拆開,其實他由以下部分組成:
1、2、4部分的含義一目了然。3里頭的scale和overlay也是字面的意思,不難理解。然而,-filter_complex濾鏡的參數結構就不是那么好理解了,比如說那一坨[]里頭的東西是什么鬼?
來,一個個解釋。
[1:v]這個里頭兩個參數,1表示的是操作對象的編號。在本例中0就是原始視頻文件input.mp4,1就是image1.png,2就是image2.png,3就是output.mp4。而另一個參數v表示操作對象里的視頻信息。
[img1]是這個操作過濾器的名字。(當然名字可以隨便起)
所以這頭一句 [1:v]scale=100:100[img1] 的意思就是對圖片imagei.png進行調節尺寸的操作,并將這個操作的結果命名為img1。后面的[2:v]和[img2]也是一個意思。
我們繼續,overlay前面 [0:v][img1] 湊一起是什么意思呢。0自然就是指的原始視頻,這句的意思就是將[img1]疊加到0對象的視頻上。本例中就是把image1.png疊加到input.mp4上。這里需要注意的就是順序:后一個對象疊加到前一個上,后一個對象在上層。如果寫成 [img1][0:v] ,那相對本例其實就是把視頻疊加到圖片imge1.png上。這樣的話一般來說由于視頻通常是全屏,等于用視頻覆蓋了圖片,水印完全看不到了。
好,我們又把這個操作的結果命名為[bkg],那么接下來 [bkg][img2] 的意思就很明了了。就是把image2.png再疊加上去,image2.png是在最上層的,如果位置重合的話,他會遮蓋 image1.png的水印。
于是,事就這樣成了。
1.水印的移動:
這里需要用到時間參數。
比如: overlay=0+t*20:0
這里在x坐標上加上了 +t*10 ,于是水印就會慢慢向右邊移動。
2.特定時間顯示水印:
這次不僅要用到時間參數,還要用上條件語句。
if條件語句的基本結構就是
再來看看計算表達式。
這里用到了表達式 gte(x,y) 。如果x大于等于y則表達式的值為1,反之為0。
所以 if(gte(t,2),10,NAN) 的意思就是,當時間大于等于2秒時,水印x位置為10,反之不顯示水印。(或者你也可以用 lte 來判斷“小于或等于”)
要了解所有表達式的話,可以去啃一下ffmpeg官方文檔的 Expression Evaluation 部分。
參考:
ffmpeg 基本用法大全
ffmpeg Documentation
contrast
n.對比,對照; 差異; 對照物,對立面; [攝]反差;
[英][?k?ntrɑ:st][美][?kɑ:ntr?st]
contrast
[英][k?n?trɑ:st][美][k?n?tr?st]
vi.對比; 形成對照;
vt.使對照,使對比; 和…形成對照;