2010-08-12 118 views
4

必須有辦法做到這一點。我用html5畫布畫了一個形狀,我想模糊它。據我所知,沒有本地方法,所以我假設需要一個js庫。問題是大多數圖書館只模糊圖像,例如this。這可能嗎?html畫布形狀模糊濾鏡

+0

試試這個:http://www.pixastic.com/lib/docs/actions/blurfast/ – 2014-07-08 03:35:09

回答

1

您鏈接的pixastic庫示例實際上應該使用canvas元素作爲第一個參數而不是圖像。

默認情況下,pixastic庫會嘗試用您創建的canvas元素替換您傳入的節點。爲了防止這樣做,您可以添加一個選項來指定離開DOM節點,幷包含一個回調以自己處理返回的數據。事情是這樣的:

Pixastic.process(canvas, "blur", { leaveDOM: true }, function(img) { 
    canvas.getContext('2d').drawImage(img, 0, 0); 
}); 

另外,如果你不希望依賴於庫,可以實現自己使用getImageData()模糊,操縱返回的像素數據,並使用putImageData()來繪製模糊圖像回到畫布。

另外需要注意的是,單個像素操作速度較慢,可能無法很好地處理大圖像。如果這是一個問題,您可以嘗試縮小圖像並縮小圖像,以便快速完成模糊效果。事情是這樣的:

ctx.drawImage(canvas, 0, 0, canvas.width/2, canvas.height/2); 
ctx.drawImage(canvas, 0, 0, canvas.width/2, canvas.height/2, 0, 0, canvas.width, canvas.height);
+0

酷,雖然這工作肯定,它不表現我喜歡的方式。我需要邊緣模糊很像高斯模糊行爲。我認爲這個庫使用框模糊方法。有任何想法嗎? – 2010-08-12 23:40:33

+0

我不知何故忽略了你的第二種方法。讓我給一個鏡頭。 – 2010-08-12 23:57:10

+0

你會碰巧有一個使用getImageData方法的例子嗎? – 2010-08-13 02:45:16

10

你可以使用CSS來模糊畫布。如果它只是你想要模糊的形狀,那麼這個形狀將需要位於它自己單獨的圖層(畫布)上,您可以隨時創建它。

例子:

canvas.style.webkitFilter = "blur(3px)"; 

您可以再次與聯合國模糊的帆布:

canvas.style.webkitFilter = "blur(0px)"; 

這可能是最快的(也是最簡單)的方式模糊的畫布 - 特別是對於移動設備。

+6

webkitFilter - 是否可以在所有瀏覽器上使用? – David 2014-01-15 13:27:22

+0

@David,除了Edge和Firefox以外,都可以。看到這個[圖表](http://caniuse.com/#search=filter)。 – 2016-05-09 07:29:03

+1

@Mirabilis Edge很好,但Firefox不那麼如此。所以我不會用「是」結束那句話。 – wizzwizz4 2016-08-01 13:31:36