Android之玩轉(zhuǎn)View(五):Paint之濾鏡和顏色矩陣

Paint之濾鏡和顏色矩陣

請(qǐng)尊重原創(chuàng)微谓,轉(zhuǎn)載請(qǐng)注明出處【tianyl】的博客

關(guān)于的Android之玩轉(zhuǎn)View目錄

前言

之前已經(jīng)說了Paint繪制的一些api和Xfermode,關(guān)于Paint的內(nèi)容缩筛,也只剩下濾鏡了

濾鏡的定義,可以看百度百科贾富,這里就不重復(fù)了,Paint中對(duì)濾鏡的使用诚撵,主要也就是透明度和顏色兩個(gè)方面,而說到顏色广料,就不得不提一些顏色矩陣砾脑,下面就從這幾個(gè)方面說起

  • 注:本文中的示例代碼使用kotlin編寫

1 顏色矩陣

首先,在Android中顏色是通過一個(gè)數(shù)字矩陣進(jìn)行表示的
關(guān)于矩陣的定義可以查看百度百科

例如艾杏,對(duì)于一個(gè)顏色用矩陣C表示韧衣,對(duì)這個(gè)顏色的處理方式用矩陣A表示,如下


根據(jù)矩陣的相乘购桑,獲得處理后的顏色矩陣如下:


所以

R1 = aR + bG + cB + dA + e;
G1 = fR + gG + hB + iA + j;
B1 = kR + lG + mB + nA + o;
A1 = pR + qG + rB + sA + t;

當(dāng)a畅铭,g,m勃蜘,s為1硕噩,其他值為0的時(shí)候,這個(gè)矩陣就是顏色的初始矩陣(經(jīng)過這個(gè)矩陣處理后的顏色不會(huì)發(fā)生改變)


初始矩陣

e缭贡,j炉擅,o,t就是顏色RGBA的偏移量阳惹,a谍失,g,m莹汤,s就是RGBA的系數(shù)快鱼,通過改變這幾個(gè)值,就可以實(shí)現(xiàn)一些濾鏡效果

2 BlurMaskFilter

Android直接提供了兩個(gè)濾鏡的效果類纲岭,分別是EmbossMaskFilter和BlurMaskFilter

BlurMaskFilter是Android中MaskFilter的一個(gè)子類抹竹,其中MaskFilter有兩個(gè)子類

  • EmbossMaskFilter:實(shí)現(xiàn)類似浮雕的效果
  • BlurMaskFilter:實(shí)現(xiàn)模糊效果

由于EmbossMaskFilter使用較少,而且官方文檔上顯示已經(jīng)廢棄止潮,所以這里略過窃判,直接說說會(huì)用到的BlurMaskFilter

BlurMaskFilter的構(gòu)造方法很簡(jiǎn)單

public BlurMaskFilter(float radius, Blur style)

radius是模糊半徑,越大模糊范圍越大
style是模糊風(fēng)格喇闸,它是一個(gè)枚舉兢孝,有四個(gè)值

  • NORMAL:整個(gè)圖像都被模糊掉
  • SOLID:圖像邊界外產(chǎn)生一層與Paint顏色一致陰影效果,不影響圖像的本身
  • OUTER:圖像邊界外產(chǎn)生一層陰影仅偎,并且將圖像變成透明效果
  • INNER:在圖像內(nèi)部邊沿產(chǎn)生模糊效果

它的使用方式如下

private fun init() {
    //初始化
    mPaint = Paint(Paint.ANTI_ALIAS_FLAG)
    mPaint.color = Color.RED
    bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.png1);
}

override fun onDraw(canvas: Canvas?) {
    super.onDraw(canvas)
    //不支持硬件加速所以關(guān)閉
    setLayerType(View.LAYER_TYPE_SOFTWARE, mPaint)
    //繪制
    val rectF = RectF(100f, 100f, bitmap.width.toFloat()+100f, bitmap.height.toFloat()+100f)
    mPaint.setColor(Color.RED)
    mPaint.maskFilter = BlurMaskFilter(200f, BlurMaskFilter.Blur.NORMAL)
    canvas?.drawBitmap(bitmap, null, rectF, mPaint);
}

具體效果如下


  • NORMAL
    整個(gè)圖像都被模糊掉跨蟹,如上圖左上方

  • SOLID
    圖像邊界外產(chǎn)生一層與Paint顏色一致陰影效果,不影響圖像的本身橘沥,如上圖右上方

  • OUTER
    圖像邊界外產(chǎn)生一層陰影窗轩,并且將圖像變成透明效果,如上圖左下方

  • INNER
    在圖像內(nèi)部邊沿產(chǎn)生模糊效果座咆,如上圖右下方

3 ColorMatrix

除了直接使用的濾鏡效果痢艺,Android中還提供了顏色矩陣仓洼,可供我們自己實(shí)現(xiàn)自定義的效果

上文說Android中ARGB顏色是矩陣表示的,所以如果我們想對(duì)圖像進(jìn)行顏色處理堤舒,那么就可以通過顏色矩陣進(jìn)行實(shí)現(xiàn)色建,具體的使用方式如下

var floats = floatArrayOf (
    1f, 0f, 0f, 0f, 0f,
    0f, 1f, 0f, 0f, 0f,
    0f, 0f, 1f, 0f, 0f,
    0f, 0f, 0f, 0.5f, 0f
)
var colorMartrix = ColorMatrix(floats)
val rectF2 = RectF(600f, 100f, 600f + bitmap.width, bitmap.height.toFloat())
mPaint?.colorFilter = ColorMatrixColorFilter(colorMartrix)
canvas?.drawBitmap(bitmap, null, rectF2, mPaint)

關(guān)于顏色矩陣已經(jīng)在第一部分解釋過了,所以這里不再展開舌缤,此處的顏色矩陣的作用是將改圖的alpha值乘以0.5箕戳,即將圖片變?yōu)榘胪该鳎Ч缦拢ㄗ蠓綖樵瓐D国撵,右方是處理后的圖)


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末陵吸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子介牙,更是在濱河造成了極大的恐慌壮虫,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件环础,死亡現(xiàn)場(chǎng)離奇詭異囚似,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)线得,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門谆构,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人框都,你說我怎么就攤上這事『浅浚” “怎么了魏保?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)摸屠。 經(jīng)常有香客問我谓罗,道長(zhǎng),這世上最難降的妖魔是什么季二? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任檩咱,我火速辦了婚禮,結(jié)果婚禮上胯舷,老公的妹妹穿的比我還像新娘刻蚯。我一直安慰自己,他們只是感情好桑嘶,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布炊汹。 她就那樣靜靜地躺著,像睡著了一般逃顶。 火紅的嫁衣襯著肌膚如雪讨便。 梳的紋絲不亂的頭發(fā)上充甚,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音霸褒,去河邊找鬼伴找。 笑死,一個(gè)胖子當(dāng)著我的面吹牛废菱,可吹牛的內(nèi)容都是我干的技矮。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼昙啄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼穆役!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起梳凛,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤耿币,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后韧拒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淹接,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年叛溢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了塑悼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡楷掉,死狀恐怖厢蒜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情烹植,我是刑警寧澤斑鸦,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站草雕,受9級(jí)特大地震影響巷屿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜墩虹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一嘱巾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诫钓,春花似錦旬昭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春场梆,著一層夾襖步出監(jiān)牢的瞬間墅冷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工或油, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寞忿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓顶岸,卻偏偏與公主長(zhǎng)得像腔彰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辖佣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361