以前用過不少秀圖程式,可以做很多濾鏡特效,當時並不曉得那些特效是怎麼算出來的,在 SVG 的濾鏡中有一個有趣的濾鏡 feConvolveMatrix 利用一個陣列,就可以做出很多種特效
原理
以 3x3 為例,原來的值是 a,b,c,...,g,h,i 當使用陣列
*注意,下圖 1~9 的排列和一開始的陣列相反
9 | 8 | 7 |
6 | 5 | 4 |
3 | 2 | 1 |
a | b | c |
d | e | f |
g | h | i |
而 b 的值會變成
9 | 8 | 7 |
6 | 5 | 4 |
3 | 2 | 1 |
a | b | c |
d | e | f |
g | h | i |
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
沒有留言:
張貼留言