Git Product home page Git Product logo

wx-caman's Introduction

wx-caman

Build Status

基于 CamanJS 的微信小程序 Canvas 像素级滤镜处理库

介绍

由于微信小程序中的 canvas 组件与 DOM Canvas 元素有较大差异,因此传统的 Canvas 处理库几乎无法在小程序中使用。wx-caman 由 CamanJS 封装而来并针对微信小程序进行了适配。其使用基本与 CamanJS 保持一致,能够对小程序中的 canvas 进行像素级别的图像滤镜处理。

安装

npm

mpvue 等支持 npm 的小程序开发框架中,可以直接使用 npm 进行安装:

npm install wx-caman

然后在项目中引入:

// es6 modules
import WxCaman from 'wx-caman'

// or cjs
var WxCaman = require('wx-caman').default

直接引入文件

将当前 repo 中 dist/ 目录下的 wx-caman.min.js 文件直接拷贝至你的小程序项目中的 vendor 目录下,然后在项目中引入:

var WxCaman = require('vendor/wx-caman.min.js').default

快速开始

小程序对于 canvas 组件限制较多,详情参考官方文档。在使用 wx-caman 前,我们必须在 WXML 中定义 canvas 组件并且设置 canvas-id。

<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()
      })
    })
  }
})

进阶使用

此处文档可直接参考 CamanJS 文档:AsvancedUsage

注:wx-caman 不支持 Cropping/Resizing 和 Events。

内置函数

此处文档可直接参考 CamanJS 文档:Built-In Functionality

支持基础滤镜如下:

  • Brightness
  • Channels
  • Clip
  • Colorize
  • Contrast
  • Curves
  • Exposure
  • Fill Color
  • Gamma
  • Greyscale
  • Hue
  • Invert
  • Noise
  • Saturation
  • Sepia
  • Vibrance

预设滤镜

wx-caman 支持以下预设滤镜:

  • vintage
  • lomo
  • sinCity
  • sunrise
  • crossProcess
  • orangePeel
  • love
  • grungy
  • pinhole
  • oldBoot
  • glowingSun
  • hazyDays
  • herMajesty
  • nostalgia
  • hemingway

其中,vintage/lomo/sunrise/grungy/pinhole/oldBoot/glowingSun/hazyDays/nostalgia 可接收一个 Boolean 参数,表示是否使用晕映效果,默认为 true,即使用晕映效果。

使用示例:

new WxCaman('firstCanvas', 300, 200, function () {
  this.lomo(false)
  this.render()
})

注意事项

  • 为了确保 wx-caman 准确获取 canvas 组件的像素数据,请务必在 draw 的回调函数中使用 wx-caman
  • wx-caman 需要获取到 canvas 组件的真实宽高。但在实际使用中 canvas 组件可能使用了 width: 90% 等相对宽高数值,此时可使用 wx.createSelectorQuery() 来获取到 canvas 组件渲染后的实际宽高,然后再进行 wx-caman 的初始化

wx-caman's People

Contributors

chriscindy avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wx-caman's Issues

会被覆盖处理

有多个滤镜,每次点击的时候,不是清空上一个,而是合并了上一个和当前点击的

可以在canvas区域加载一张图片吗?并且给图片使用滤镜效果。

   我直接在new WxCaman加图片地址,好像不行。

wx.getImageInfo({
src: self.data.imgUrl,
success: function (res) {
var ctx = wx.createCanvasContext('canvasImg');
self.setData({
canvasWidth: res.width,
canvasHeight: res.height
})
// ctx.drawImage(self.data.imgUrl, 0, 0, res.width, res.height)
ctx.draw(false, res.width, res.height, function () {
new WxCaman('canvasImg','self.data.imgUrl', function () {
this.brightness(90)
this.contrast(90)
this.sepia(90)
this.saturation(-90)
this.render()
})
})
}
})

小程序 canvas 2d 进行支持

小程序对canvas 做了重构 ,2.9.0 起支持一套新 Canvas 2D 接口,同时支持同层渲染
亲测大图不会闪退相对于以前性能更好些
希望 wx-caman 做下支持 🙏
@ChrisCindy

报错

请问:控制台显示WxCaman未定义和SDK错误是什么情况?尝试过在page()之前var 了,后来也试了在app.js中var了,但是都报错,如何解决?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.