xFermode的原理及使用

2021-07-02 23:33:20 字數 3909 閱讀 6440

xfermode是畫筆的乙個屬性,有點類似於ps中的圖層,有乙個底層圖層,和乙個頂層圖層,通過兩個圖層疊放層次的不同,可以做出很多好玩的效果。

谷歌官方的apidemo中生成了兩個圖層的各種疊放次序效果:

是不是有點摸不著頭腦,讓我們列個**來解釋一下吧:

屬性名屬性常量

屬性說明

clear

porterduff.mode.clear

所有的圖層都不會在畫布上展示

srcporterduff.mode.src

只顯示頂層圖層的影象

dstporterduff.mode.dst

只顯示底層圖層的影象

srcover

porterduff.mode.src_over

顯示所有圖層,頂層圖層位於底層圖層上面(預設效果)

dstover

porterduff.mode.dst_over

顯示所有圖層,底層圖層位於頂層圖層上面

srcin

porterduff.mode.src_in

顯示兩個圖層的交集,頂層圖層位於底層圖層上面

dstin

porterduff.mode.dst_in

顯示兩個圖層的交集,底層圖層位於頂層圖層上面

srcout

porterduff.mode.src_out

顯示兩個圖層的部分非交集,只顯示頂層圖層的非交集部分

dstout

porterduff.mode.dst_out

顯示兩個圖層的部分非交集,只顯示底層圖層的非交集部分

srctop

porterduff.mode.src_atop

顯示底層圖層和兩個圖層的交集部分,頂層位於底層圖層的上面

dsttop

porterduff.mode.dst_atop

顯示頂層圖層和兩個圖層的交集部分,底層圖層位於頂層圖層上面

xorporterduff.mode.xor

顯示兩個圖層的完整非交集

darken

porterduff.mode.darken

顯示所有圖層,頂層位於底層圖層上面,相交部位變暗

lighten

porterduff.mode.lighten

顯示所有圖層,頂層位於底層圖層上面,相交部位變暗

multiply

porterduff.mode.multiply

顯示兩個圖層的交集,顏色變換類似於ps中的「正片疊底」效果

screen

porterduff.mode.screen

顯示兩個圖層的並集,顏色變換類似於ps中的「濾色」效果

tips:正片疊低效果就是把兩個圖層中的顏色進行疊加,這樣暗的部分會被加強;

濾色效果也是對兩個圖層中的顏色進行疊加,但亮的部分會被加強。

原理:雖然上面的**中將xfermode解釋成圖層的並集交集的疊放,但事實上系統是通過對sa(source alpha,src的透明度)、da(destination alpha,dat的透明度)、sc(source color,src的顏色)、dc(destination color,dat的透明度),四個值來進行運算來達到變換的效果。

我們可以在原始碼中看到相應的運算公式:

/** [0, 0] */

clear (0),

/** [sa, sc] */

src (1),

/** [da, dc] */

dst (2),

/** [sa + (1 - sa)*da, rc = sc + (1 - sa)*dc] */

src_over (3),

/** [sa + (1 - sa)*da, rc = dc + (1 - da)*sc] */

dst_over (4),

/** [sa * da, sc * da] */

src_in (5),

/** [sa * da, sa * dc] */

dst_in (6),

/** [sa * (1 - da), sc * (1 - da)] */

src_out (7),

/** [da * (1 - sa), dc * (1 - sa)] */

dst_out (8),

/** [da, sc * da + (1 - sa) * dc] */

src_atop (9),

/** [sa, sa * dc + sc * (1 - da)] */

dst_atop (10),

/** [sa + da - 2 * sa * da, sc * (1 - da) + (1 - sa) * dc] */

xor (11),

/** [sa + da - sa*da,

sc*(1 - da) + dc*(1 - sa) + min(sc, dc)] */

darken (12),

/** [sa + da - sa*da,

sc*(1 - da) + dc*(1 - sa) + max(sc, dc)] */

lighten (13),

/** [sa * da, sc * dc] */

multiply (14),

/** [sa + da - sa * da, sc + dc - sc * dc] */

screen (15),

/** saturate(s + d) */

add (16),

overlay (17);

使用的時候我們需要設定兩個圖來進行疊加:

setlayertype(layer_type_software, null); //關閉硬體加速

mbitmap = bitmapfactory.decoderesource(getresources(), r.drawable.ms);

mout = bitmap.createbitmap(mbitmap.getwidth(), mbitmap.getheight(), bitmap.config.argb_8888);

canvas canvas = new canvas(mout);

mpaint = new paint(paint.anti_alias_flag);

rectf rt = new rectf();

rt.left = 0; //矩形的左起點

rt.top = 0; //矩形的頂部起點

rt.right = mbitmap.getwidth(); //矩形的右終點

rt.bottom = mbitmap.getheight(); //矩形的底部終點

//dat

canvas.drawroundrect(rt, 50, 50, mpaint);

//設定xfermode

mpaint.setxfermode(new porterduffxfermode(porterduff.mode.src_in));

//src

canvas.drawbitmap(mbitmap, 0, 0, mpaint);

//還原xfermode

通過上面的**我們就將本來是直角的**,變成了圓角矩形。

引用宣告:慕課網《android影象處理-變」換」莫測的影象》————eclipse_xu

memcached 的使用及原理

overview 什麼是memcached?memcached是國外社群 livejournal 的開發團隊開發的高效能的分布式記憶體快取伺服器。一般的使用目的是,通過快取資料庫查詢結果,減少資料庫訪問次數,以提高動態web應用的速度 提高可擴充套件性。livejournal 團隊開發了包括 mem...

token的原理及使用

一 登陸的驗證流程 當使用者請求登陸的時候,如果沒有問題,我們在服務端生成一條記錄,這個記錄可以說明一下登陸的使用者是誰,然後把這條記錄的id號傳送給客戶端,客戶端收到以後把這個id號儲存在cookie裡,下次這個使用者再次向服務端發 送請求的時候,可以帶著這個cookie,這樣服務端會驗證乙個這個...

Token的原理及使用

首先,當使用者請求登入的時候如果沒有問題,我們會在服務端生成一條記錄,在這個記錄裡面有登陸的使用者是誰,然後服務端會把id號傳送給客戶端,客戶端收到這個id後會把他儲存在cookie裡面,下次使用者再向伺服器傳送請求的 時候可以帶著這個cookie,這樣服務端會驗證一下cookie裡面的資訊,看能否...