Translate

2020年12月20日 星期日

有趣的 SVG filter - feConvolveMatrix

以前用過不少秀圖程式,可以做很多濾鏡特效,當時並不曉得那些特效是怎麼算出來的,在 SVG 的濾鏡中有一個有趣的濾鏡 feConvolveMatrix 利用一個陣列,就可以做出很多種特效

參考資料: 這裡 , 這裡

原理

以 3x3 為例,原來的值是 a,b,c,...,g,h,i 當使用陣列 去計算時,a 的值會等於

*注意,下圖 1~9 的排列和一開始的陣列相反

987
654
321
abc
def
ghi

而 b 的值會變成

987
654
321
abc
def
ghi

feConvolveMatrix 參數說明

order             設定陣列大小,建議用最小值 3 (預設),不然很吃 cpu 資源
kernelMatrix      陣列設定
divisor           預設是陣列所有值加起來,也可以從這裡設定
bias              預設為 0
edgeMode          duplicate(預設),wrap,none
preserveAlpha     false(預設),true
targetX           目標像素的中心位置
targetY
kernelUnitLength  偏移

先來一個簡單範例


<svg width="300" height="500" style="background-color:#fff" color-interpolation-filters="sRGB">
<defs>
<filter id="a122001_f1" width="100%" height="100%" x="0" y="0">
  <feConvolveMatrix in="SourceGraphic" order="3" edgeMode="none" kernelMatrix="-2 -1   0
     -1  1   1
     0   1   2" preserveAlpha="true"></feConvolveMatrix>
</filter>
</defs>
<text x="10" y="20">原圖</text>
<image href="https://yiharng.github.io/cat280.jpg" x="10" y="30" width="280" height="210"></image>
<text x="10" y="270">濾鏡</text>
<image href="https://yiharng.github.io/cat280.jpg" x="10" y="280" width="280" height="210" style="filter:url(#a122001_f1);"></image>
</svg>
原圖 濾鏡

最後寫了一個自己設定矩陣參數的程式,做為這一篇的結束。









c

m

n

沒有留言:

張貼留言