做這個專案的初衷是希望能夠開發一款不依賴服務端而純通過客戶端渲染為圖片新增濾鏡的小程式。但是由於微信小程式中的 canvas 元件與 DOM Canvas 元素有較大差異,因此傳統的 Canvas 處理庫幾乎無法在小程式中使用。在調研了一些傳統瀏覽器端的專案後,我發現 CamanJS 的功能比較完善,同時也比較容易對微信小程式進行適配。在閱讀完畢 CamanJS 原始碼(順便學習了一下 CoffeeScript)以及學習了小程式的 canvas 元件的條條框框之後,wx-caman 就誕生了。wx-caman 由 CamanJS 封裝而來,基於 ES6 進行了重寫,並針對微信小程式進行了適配。其使用基本與 CamanJS 保持一致,同時剔除了無關功能,能夠對小程式中的 canvas 進行畫素級別的影像濾鏡處理。
wx-caman 支援多個常見圖片濾鏡處理,例如 Brightness、Contrast、Sepia、Saturation 等,同時還內建了多個預設濾鏡例如 lomo、sunrise、sinCity 等,方便直接使用;支援多圖層混合,常見的混合模式 multiply、overlay 等也都悉數支援。
使用上,下面是一個簡單示例:
<canvas style="width: 300px; height: 200px;" canvas-id="firstCanvas"></canvas>
Page({
onReady: function (e) {
// 使用 wx.createContext 獲取繪圖上下文 context
var context = wx.createCanvasContext(`firstCanvas`)
context.setStrokeStyle(`#00ff00`)
context.setLineWidth(5)
context.rect(0, 0, 200, 200)
context.stroke()
context.setStrokeStyle(`#ff0000`)
context.setLineWidth(2)
context.moveTo(160, 100)
context.arc(100, 100, 60, 0, 2 * Math.PI, true)
context.draw(false, function() {
new WxCaman(`firstCanvas`, 300, 200, function () {
this.brightness(10)
this.contrast(30)
this.sepia(60)
this.saturation(-30)
this.render()
})
})
}
})
想要了解更多可移步專案倉庫,歡迎 star,同時使用過程中有任何問題也歡迎提交 issue。
本文首發於我的部落格(點此檢視),歡迎關注。