关于Canvas

被面试官问到海报的制作,根本不懂什么是canvas,更别说写了.回来我就研究了canvas,发现确实不是很好理解哈哈.看了关于很多canvas的文章以及实战,稍稍参透了一点点,感兴趣的朋友可以一起看看.

1.canvas介绍

​ <canvas> 是 HTML5 新增的,可以使用脚本JavaScript绘制图像的 HTML 元素。它可以用来制作照片集或者制作简单(也不一定简单)的动画,还可以进行实时视频处理和渲染.

2.基本使用

<canvas id="canvas" width="xxx" height="xxx"></canvas>

注意:不要用 CSS 控制它的宽和高,会出现图片扭曲;重新设置 Canvas 标签的宽高属性会让画布擦除所有的内容

3.content

canvas相当于一个画布,content相当于画布内容,其中有2d和3d,目前我们看的是2d渲染的上下文

// 获取 canvas 元素
var cvs  = document.getElementById('canvas'); 
// 获取绘图功能API集合对象
var ctx = canvas.getContext('2d');

 坐标系:左上角为坐标原点,向右和向下延伸X轴和Y轴,但是轴上的值都为正值.

步骤:

1.创建路径起始点(画笔落笔)

2.用绘制方法去绘制出路径(画线条)

3.路径封闭(画笔首尾相连)

4.通过描边或填充路径区域来渲染图形(涂色)

api:

1 .创建路径  ctx.beginPath();

2 . 移动画笔 ctx.moveTo(x, y);

3 . 画线条 ctx.lineTo(x, y);

4 . 闭合路径 ctx.closePath();

5 . 绘制图形轮廓 ctx.stroke()线条 / ctx.fill()实心;

其中所有样式默认是黑色的.想给其更换颜色

设置描边的颜色,写在描边语句之前 : ctx.strokeStyle = color

设置填充的颜色,写在填充语句之前 : ctx.fillStyle = color

mounted() {
        function draw () {
            // 找到元素
            var canvas = document.getElementById('canvas');
            if(canvas.getContext){
                // 获取上下文对象
                var ctx = canvas.getContext('2d');
            }
            canvas.style.backgroundColor = '#7c8dcb';
            ctx.beginPath();
            ctx.moveTo(50, 50);
            ctx.lineTo(150, 50);
            ctx.lineTo(150, 150);
            ctx.lineTo(50, 130);
            ctx.fill();
        }
        draw();
    },

绘制直线

画好的线条可设置不同样式

设置线的宽度 : ctx.lineWidth = 20;

设置线条末端样式 : ctx.lineCap = 'square' (方形) / 'round' (圆形)  / 'square' (方形,加了一个宽度,高度是线段厚度一半的矩形区域)

设置两条线相交的拐角类型 : ctx.lineJoin = 'miter'(尖角,默认) / 'round'(圆角) / 'bevel'(邪教)

设置虚线样式 : ctx.setLineDash([实线长度, 间隙长度])

设置虚线样式的起始偏移量 : ctx.lineDashOffset = -20

快速创建矩形

创建矩形 : ctx.rect(x, y, width, height)

创建描边矩形 : ctx.strokeRect(x, y, width, height)

创建填充矩形 : ctx.fillRect(x, y, width, height)

清除内容 : ctx.clearRect(x, y, width, hegiht)

x,y上方是起始点坐标位置,width, height为矩形的宽高

mounted() {
        function draw () {
            // 找到元素
            var canvas = document.getElementById('canvas');
            if(canvas.getContext){
                // 获取上下文对象
                var ctx = canvas.getContext('2d');
            }
            canvas.style.backgroundColor = '#7c8dcb';
            ctx.beginPath();
            ctx.fillRect(30, 30, 200, 200);  //矩形
            ctx.clearRect(50, 50, 50, 50)   //清除
            ctx.fill();
        }
        draw();
    },

圆形

创建圆形 : ctx.arc(x,y,r,sAngle,eAngle,counterclockwise)

  • x,y:圆心坐标
  • r:半径
  • sAngle:绘制开始弧度
  • eAngle:结束弧度
  • counterclockwise:是否逆时针(true表示逆时针,false顺时针)

弧度和角度的转换公式: rad(弧度) = deg(角度) * Math.PI/180

 mounted() {
        function draw () {
            // 找到元素
            var canvas = document.getElementById('canvas');
            if(canvas.getContext){
                // 获取上下文对象
                var ctx = canvas.getContext('2d');
            }
            canvas.style.backgroundColor = '#7c8dcb';
            ctx.beginPath();
            ctx.arc(50, 150, 40, -Math.PI / 2, Math.PI / 2, false);
            ctx.fill();
        }
        draw();
    },

绘制文本

绘制填充文本 : ctx.fillText(text,x,y,maxWidth)  

绘制文本边框 : ctx.strokeText(text, x, y [, maxWidth])

(x,y)位置 maxWidth绘制的最大宽度

文本添加样式

绘制文本的样式 : ctx.font = "100px sans-serif "  语法与cssfont相同

文本对齐 : ctx.textAlign = 'start'(默认) / end / left / right /center

文字基线 : ctx.textBaseline = 'alphabetic'(默认) / top / hanging(悬挂基线) / middle / alphabetic / ideographic / bottom

 

文本方向 : ctx.direction = 'inherit' (默认) / ltr / rtl / inherit

mounted() {
        function draw () {
            // 找到元素
            var canvas = document.getElementById('canvas');
            if(canvas.getContext){
                // 获取上下文对象
                var ctx = canvas.getContext('2d');
            }
            canvas.style.backgroundColor = '#7c8dcb';
            // 绘制文本
            ctx.font = '30px sans-serif'
            ctx.textAlign  = 'center'
            ctx.fillText('今天星期五',100,100)
        }
        draw();
    },

绘制图片

创建图片元素 : ctx.drawImage(img,x,y);

data() {
        return {
            img:'http://t13.baidu.com/it/u=2296451345,460589639&fm=224&app=112&f=JPEG?w=500&h=500'
        };
    }, 
mounted() {
        var _this = this;
        function draw () {
            // 找到元素
            var canvas = document.getElementById('canvas');
            if(canvas.getContext){
                // 获取上下文对象
                var ctx = canvas.getContext('2d');
            }
            canvas.style.backgroundColor = '#7c8dcb';
              // 绘制图片
            var img = new Image();
            img.onload = function(){
                ctx.drawImage(img, 0, 0)
            }
            img.src = _this.img
         }
         draw();
},

注意 : 图片是从网络加载,所以我们应该保证在 img 绘制完成之后再 drawImage

对img元素图片绘画 : ctx.context.drawImage(img,x,y,width,height);

 <img src="路径" alt="">
 <canvas id="canvas" width="300" height="500">
    <!-- 替换 -->
    当前浏览器不支持canvas元素,请升级或者更换浏览器
 </canvas>
<script type="text/javascript">
  mounted() {
        var _this = this;
        function draw(){
            var canvas = document.getElementById('canvas');
            if(canvas.getContext){
                var ctx = canvas.getContext("2d");
            }
            var img = document.querySelector("img");
            ctx.drawImage(img, 10, 20, 100, 100);
        }
        document.querySelector("img").onclick = function (){
            draw();
        }
     draw();
    }

</script>

图片裁剪 : ctx.context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);

sx/sy:裁剪的左上角坐标

swidth/sheight:裁剪图片宽高

保存和返回

canvas的环境就相当于当前画面应用的所有样式和变形的一个快照。对其进行保存和还原,

每一次调用save()方法后,状态就被推送一次到栈中保存。可以调用任意多次,类似数组的push()

保存当前环境 : ctx.save()

返回环境 : ctx.restore()

转换图片并保存

canvas的意义是可下来保存或转发.把canvas绘制的内容输出成base64内容.

转换base64图片 : canvas.toDataURL(type, encoderOptions);

type : 设置输出类型,比如 iamge / png image / jpeg

var cvs = document.querySelector("canvas");
var imgSrc = cvs.toDataURL("image/png", 1);
$("body").append(`<a href="${imgSrc}" download="cvs">下载</a>`)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值