云积分-canvas实践

499 阅读3分钟

什么是canvas

Canvas 是 HTML5 提供的一个用于展示绘图效果的标签. Canvas 原意为画布, 在 HTML 页面中用于展示绘图效果. 最早 Canvas 是苹果提出的一个方案, 今天已经在大多数浏览器中实现。

canvas 的使用领域

  1. 游戏(h5小游戏,利用canvas(画布)可以实现硬件加速,因为好的流畅性能带给玩家更好的体验)
  2. 大数据可视化数据
  3. banner 广告
  4. 多媒体
  5. 模拟仿真
  6. 远程操作
  7. 图形编辑(添加水印,马赛克,缩放,滤镜)

canvas 的基本用法

  1. 使用 canvas 标签, 即可在页面中开辟一格区域,可以设置其宽高,宽高为 300 和 150
<canvas></canvas>
  1. 获取 dom 元素 canvas canvas 本身不能绘图. 是使用 JavaScript 来完成绘图. canvas 对象提供了各种绘图用的 api。
var cas = document.querySelector('canvas')
  1. 通过 cas 获取上下文对象(画布对象!)
var ctx = cas.getContext('2d')
  1. 通过 ctx 开始画画(设置起点 设置终点 连线-描边 )
ctx.moveTo(10, 10)
ctx.lineTo(100, 100)
ctx.stroke()

小试牛刀

1.简单画线demo

html

<canvas width="200" height="200" style="border:1px solid black"></canvas>

js

var cas = document.querySelector('canvas');
var ctx = cas.getContext('2d');
//demo1 简单地线
ctx.moveTo(0, 0);//设置开始位置
ctx.lineTo(200, 200);// 设置终点位置
ctx.closePath();// 自动连回原点
ctx.lineTo(20, 100);
ctx.stroke();// 描边绘制

效果图

image.png

2. 画网格

html

<canvas width="200" height="200" style="border:1px solid black"></canvas>

js

function drawGrid(color, stepx, stepy) {
    ctx.save()
    ctx.fillStyle = 'black';
    ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);
    ctx.lineWidth = 0.5;
    ctx.strokeStyle = color;
    for (var i = stepx; i < ctx.canvas.width; i += stepx) {
        ctx.beginPath();
        ctx.moveTo(i, 0);
        ctx.lineTo(i, ctx.canvas.height);
        ctx.closePath();
        ctx.stroke();
    }
    for (var j = stepy; j < ctx.canvas.height; j += stepy) {
        ctx.beginPath();
        ctx.moveTo(0, j);
        ctx.lineTo(ctx.canvas.width, j);
        ctx.closePath();
        ctx.stroke();
    }
    ctx.restore();
}
drawGrid('green', 20, 20);

效果图

image.png

3.图片加水印

html

<canvas id="drawing" width="200" height="400" style="border:1px solid black">
    <p>The canvas element is not supported!</p>
</canvas>
<div>
  <span>
    <input type="file" id="addImgHelper">
  </span>
  <span>
    <button id="addWaterMark" disabled>添加水印</button>
    <span>水印文字为</span>
    <input id="waterMarkWords" type="text" value="我是水印">
  </span>
  <a id="downloadImgHelper" href="#" download="带水印图片" style="display: none">下载带水印图片</a>
</div>

js

var W,H;
$("#addImgHelper").change(function(e){
    var file = e.target.files[0];
    if(file && /image/.test(file.type)){
        var reader = new FileReader();
        reader.readAsDataURL(file);
        reader.onload = function(){
            var img = new Image();
            img.src= reader.result;
            img.onload = function() {
                cas.width = W = img.width;
                cas.height = H = img.height;
                ctx.drawImage(img, 0, 0);
                $('#addWaterMark').attr("disabled",false);
                $('#addWaterMark').click(function () {
                    ctx.clearRect(0, 0, W, H);
                    ctx.drawImage(img, 0, 0);
                    var str = $('#waterMarkWords').val();
                    ctx.font = "bold 50px Arial";
                    ctx.lineWidth = '1';
                    ctx.fillStyle = 'rgba(255,255,255,0.5)';
                    ctx.textBaseline = "bottom";
                    ctx.textAlign = 'end';
                    ctx.fillText(str, W - 10, H - 10, W / 2);
                    $('#downloadImgHelper').show();
                    $('#downloadImgHelper').attr("href",cas.toDataURL('image/png'));
                });
            }
        }
    }
});

效果图

image.png

4.生成海报

html

<canvas width="640" height="956" style="border:1px solid black"></canvas>

js

var img = new Image();
var img2 = new Image();
img.src= './bg.png';
img2.src= './code.png';
img.onload = function() {
    ctx.drawImage(img,0,0);
    ctx.font="30px Arial";
    ctx.fillText("分享海报,惊喜等你来!",150,900);
}
img2.onload = function() {
    ctx.drawImage(img2,280,750,100,100);
}

效果图

image.png

小常识

Canvas的像素点

首先就是像素的问题,大家有没有遇到过Canvas模糊的问题,尤其是手机,这个现象尤为明显。那么有没有解决方案呢?答案是当然有!而且并不复杂,一个属性就可以搞定!

Canvas的尺寸其实又两个,不知道大家有没有发现。一个时Canvas的大小,一个是Canvas的样式大小。

canvas.width=cWidth
canvas.height=cHeight
canvas.style.width=cWidth
canvas.style.height=cHeight
复制代码

那么这就好解决的。我们的图片如果1:1放在手机上肯定是模的,但是我们会将图片的样式宽度减少一半以上,这样就不模糊了!Canvas也是同理,只要样式大小小于Canvas大小即可。那么小多少呢?有没有一个标准?这个时候就要借用window.devicePixelRatio这个参数了,告诉我们屏幕的像素比,如果没有就2,一般来说像素比是2的情况下,Canvas就不会模糊。

const dpr=window.devicePixelRatio||2
canvas.width=cWidth*dpr
canvas.height=cHeight*dpr
canvas.style.width=cWidth
canvas.style.height=cHeight

Canvas的图片跨域

1.服务端处理,Nginx配置允许跨域;

2.放到本地,嘻嘻~~~;

Canvas调试(Mac)web inspector

webkit.org/downloads//

好用简单的封装库,特别适合移动端

github.com/xd-tayde/mc…