Canvas画布

Canvas(位图)是通过js脚本来进行绘制,而svg(矢量图)是通过标签来绘制的。

首先在body中加入canvas标签,且宽高属性要写在行内,加ID为了在js中获取画布,并进行相关操作。并且浏览器不支持canvas时,会直接显示标签内容。

HTML代码


    您的浏览器不支持Canvas!!!

然后在JS中回去canvas画布,并且获取绘制环境:

JS代码

//第一步,获取画布
var canvas = document.querySelector("#canvas");
//第二步,获取绘制环境
//getContext("2d")获取  canvas 绘制环境,参数必须传入且为2D
var ctx = canvas.getContext("2d");

然后就可以进行相关操作。

1、线段的绘制

/*
         * moveTo(X,Y)  起始位置(将画笔移到):用于表示开始一条新线的绘制
         * lineto(X,Y)  绘制线段到指定点,
         * 如果为第一条线可以不使用moveTo,否则画新线时需要先moveTo
         * stroke()  描边     
        */
        ctx.lineTo(50,50);
        ctx.lineTo(100,100);
        ctx.stroke();

2、设置线段相关属性的方法

        //设置线宽
        ctx.lineWidth = 10;
        //设置描边样式  接收所有颜色类型  red  #ccc  rgb rgba HSL?
        ctx.strokeStyle = "red";
        //设置线段交汇处样式  接收 bevel:斜角   round:圆角    miter:尖角(默认值)
        ctx.lineJoin = "bevel";
        //设置线帽  只在端点出有效  接收 round:圆帽  square:方帽  butt(屁股):无  默认
        ctx.lineCap = "square";
        
        ctx.moveTo(50,50);
        ctx.lineTo(150,50);
        ctx.lineTo(150,150);
        ctx.lineTo(50,150);
        ctx.lineTo(50,50);
        //填充
        ctx.fill();
        //填充颜色
        ctx.fillStyle = "cadetblue"
        ctx.stroke();
        
        //开始一条新路径的绘制,与closePath 没有关系,他仅仅是闭合线段
        ctx.beginPath();
        ctx.fillStyle = "cyan";
        ctx.strokeStyle = 'blue';
        ctx.moveTo(300,150);
        ctx.lineTo(50,300);
        ctx.lineTo(300,300);
        //闭合路径  将当前正在绘制的路径闭合
        ctx.closePath();        
        ctx.stroke();
        ctx.fill();

3、矩形的绘制

        /*       
         * fillRect(x,y,w,h)  填充矩形
         * strokeRect(x,y,w,h) 描边矩形
         * clearRect(x,yw,h)  擦除指定的区域
         * rect(x,y,w,h)  定义矩形路径,之后必须调用绘制方法
         * */
        //绘制矩形的三种方法
        ctx.fillStyle = "blue";
        ctx.fillRect(50,50,100,100);
        ctx.strokeRect(200,50,100,100);
        
        ctx.beginPath();
        ctx.fillStyle = "red";
        ctx.rect(350,50,100,100);
        ctx.fill();
        //ctx.stroke();
        
        ctx.beginPath();
        ctx.fillStyle = "green";
        ctx.fillRect(50,200,100,100);
        ctx.strokeRect(200,200,100,100);
        ctx.beginPath();
        ctx.fillStyle = "#ccc";
        ctx.rect(350,200,100,100);
        ctx.fill();
        
        ctx.clearRect(100,100,300,150);
        
        //清空画布
        ctx.clearRect(0,0,canvas.width,canvas.height);

4、弧形的绘制

        /** 
         * arc:弧
         * arc(cx,cy,radius,startAngle,endAngle,[是否逆时针])
         * 绘制圆弧
         * cx | cy 圆心坐标
         * radius  半径
         * startRadian  |  endRadian  开始 | 结束  弧度
         * 
         * */
        ctx.arc(250,250,100,0,Math.PI/2,true);
        ctx.fill();
        //ctx.stroke();

5、文字的绘制

/**
         * fillText(string,x,y)  填充文字
         * strokeText(string,x,y)  描边文字
         * 
         * 文字属性:
         * font  设置字体样式
         * textAlign  设置文字水平对齐方式
         * textBaseline(基线)  设置文字垂直对齐方式
         * */
        var str = "Hello Canvas!!!";
        var a = "你好画布"
        ctx.font = "40px 宋体";
        ctx.textAlign = "start";
        ctx.textBaseline = "middle";
        ctx.fillText(str,50,50);
        
        
        ctx.strokeText(a,50,150);

6、图片的绘制和设置图片像素的相关信息

/**
         * 绘制图片  要求必须在图片加载完成之后
         * drawImage(img,x,y);  图片有多大绘多大
         * drawImage(img,x,y,iw,ih);  将图片绘制在指定大小内,会压缩或拉伸图片
         * drawImage(img,ix,iy,iw,ih,cy,cy,cw,ch) 
         * 前四个由原图上剪下指定位置指定大小的图,重新绘制到画布的指定位置和指定大小
         * */
        var img = new Image();
        img.src = "./images/girl.png";
        img.onload = function () {
            //图片加载完毕
            //console.log("加载完成");
            ctx.drawImage(this,0,0);
            //ctx.drawImage(this,0,0,200,200);
            //ctx.drawImage(this,150,100,50,50,400,250,50,50);
            
            /**
             * getImageData(x,y,w,h)  获取指定范围内的像素信息
             * putImageData(imgData,x,y)  向指定范围内绘制像素信息 
             * */
            var data = ctx.getImageData(0,0,500,500);
            //console.log(data);
            var arr = data.data;
            for (var i=0;i

7、视频的绘制(需要在页面里加入一个视频标签)

var video = document.querySelector("video");
                
        video.oncanplaythrough = function () {
            //代表视频无缓冲播放         
            function _run () {
                //利用requestAnimationFrame不断的重绘图片
                ctx.drawImage(video,0,0);
                var data = ctx.getImageData(0,0,500,500);
                //console.log(data);
                var arr = data.data;
                for (var i=0;i

8、pattern绘制平铺的对象

/**
         * createPattern(img,repeatType)  创建平铺对象
         * repeatTypr : 平铺类型  repeat-X  repeat-Y  repeat  no-repeat
         * */
        var img = new Image();
        img.src = "images/1.jpg"
        img.onload = function () {
            //创建平铺(pattern:样品)对象
            var pattern = ctx.createPattern(this,"repeat");
            ctx.fillStyle = pattern;
            ctx.fillRect(0,0,200,200);
            
            ctx.arc(350,350,100,0,Math.PI*2);
            ctx.fill();
        }

9、clip裁剪图片

/**
         * clip() 裁剪
         * 1.必须有一条封闭的路径
         * 2.路径必须在 clip 之前创建
         * 3.clip 必须放在drawImage 之前调用
         * */
        var img = new Image();
        img.src = "./images/girl.png";
        img.onload = function () {
            //图片加载完毕
            ctx.arc(200,150,50,0,Math.PI*2);
            ctx.rect(50,50,100,100);
            ctx.clip();
            ctx.drawImage(this,0,0);            
        }

10、组合-----绘制多个样式设计

/**
         * 
         * ctx.globalCompositeOperation  全部混合运算
         * source  新图形  destination  旧图形  
         * source-over//默认值  新图行在上
         * destination-over  旧图形在上
         * source-in  只显示重叠部分  新图在上
         * destination-in  只显示重叠部分  新图在上
         * source-out   显示新图不重叠的部分
         * destination-out   显示旧图不重叠部分
         * source-atop  显示旧图  重叠部分显示新图
         * destination-atop  显示新图  重叠部分显示旧图
         * lighter  颜色覆盖
         * xor  重叠部分不显示
         * copy  只显示新图形
         * */
        ctx.fillStyle = "red";
        ctx.fillRect(100,100,150,150);  
        
        ctx.globalCompositeOperation = "source-atop";
        
        ctx.beginPath();
        ctx.fillStyle = "blue";
        ctx.arc(250,250,100,0,Math.PI*2);
        ctx.fill();

11、平移和旋转坐标轴

//      ctx.fillRect(0,0,200,100);
//      
//      ctx.rotate(Math.PI/4);
//      ctx.translate(250,250); //设置坐标原点    
//      ctx.fillRect(0,0,200,100);
        
        ctx.fillStyle = "blue";
        ctx.fillRect(0,0,50,50);
        
        //保存状态
        ctx.save();
        ctx.translate(250,250);
        
        ctx.fillStyle = "red";
        ctx.fillRect(0,0,100,100);
        
        //回复状态
        ctx.restore();

12、shadow设置阴影

        ctx.shadowColor = "blue";
        ctx.shadowOffsetX = -5;
        ctx.shadowOffsetY = 5;
        //模糊距离
        ctx.shadowBlur = 20;
        ctx.fillRect(200,200,100,50);
        ctx.font = "bold 60px 宋体";
        ctx.fillText("Hello Canvas!!!",100,300);

13、贝塞尔曲线

        ctx.moveTo(100,150);
        ctx.lineTo(350,50);
        ctx.lineTo(450,150);
        ctx.stroke();
        
        ctx.moveTo(100,400);
        ctx.lineTo(150,300);
        ctx.lineTo(350,250);
        ctx.lineTo(450,400);
        ctx.stroke();
        
        //二次贝斯尔
        ctx.moveTo(100,150);
        ctx.quadraticCurveTo(350,50,450,150);
        ctx.stroke();
        
        //三次贝塞尔
        ctx.moveTo(100,400);
        ctx.bezierCurveTo(150,300,350,250,450,400);
        ctx.stroke();

14、渐变

//        线性渐变
//      var lg = ctx.createLinearGradient(0,0,100,100);
//      lg.addColorStop(0,"red");
//      lg.addColorStop(0.5,"yellow");
//      lg.addColorStop(1,"blue");
//      
//      ctx.fillStyle = lg;
//      ctx.fillRect(0,0,100,100);
        
        //径向渐变
        //var rg = ctx.createRadialGradient(100,250,50,350,250,150);
        var rg = ctx.createRadialGradient(250,250,50,250,250,150);
        
        rg.addColorStop(0,"red");
        rg.addColorStop(0.5,"yellow");
        rg.addColorStop(1,"blue");
        
        ctx.fillStyle = rg;

你可能感兴趣的:(Canvas画布)