Canvas画布

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

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

HTML代码

<canvas id="canvas" width="500px" height="500px">
    您的浏览器不支持Canvas!!!
</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<arr.length;i+=4) {               
                //反色  底片色
//              arr[i] = 255 - arr[i];
//              arr[i+1] = 255 - arr[i+1];
//              arr[i+2] = 255 - arr[i+2];
                
                
                //灰度
                arr[i]=arr[i+1]=arr[i+2] = (arr[i]+arr[i+1]+arr[i+2])/3;
            }
            ctx.putImageData(data,0,0);
            
        }

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<arr.length;i+=4) {
                    
                    //反色  底片色
    //              arr[i] = 255 - arr[i];
    //              arr[i+1] = 255 - arr[i+1];
    //              arr[i+2] = 255 - arr[i+2];
                    
                    
                    //灰度
                    arr[i]=arr[i+1]=arr[i+2] = (arr[i]+arr[i+1]+arr[i+2])/3;
                }
                ctx.putImageData(data,0,0);
                requestAnimationFrame(_run);
            }
            _run();
        }

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;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,561评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,218评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,162评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,470评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,550评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,806评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,951评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,712评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,166评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,510评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,643评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,306评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,930评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,745评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,983评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,351评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,509评论 2 348

推荐阅读更多精彩内容

  • 一、简介 HTML5 中的定义:“它是依赖分辨率的位图画布,你可以在 canvas 上面绘制任何图形,甚至加载照片...
    destiny0904阅读 10,521评论 1 4
  • 一、什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像 画布是...
    EndEvent阅读 684评论 0 1
  • 1、canvas 是H5 新加入的标签 用来在页面中绘制图形 一般称之为画布。2、canvas的宽高要以属性的形...
    Simon_s阅读 496评论 0 0
  • canvas用途 游戏 小游戏 图表 报表 如 Charts插件 炫酷效果 banner 模拟器、图形编辑器 等...
    飞鱼_JS阅读 944评论 0 2
  • 据韩媒爆料“宋承宪刘亦菲即将完婚”,并且“刘亦菲已怀孕”~ 呸!大写加粗的不!要!脸!啊,神仙姐姐怀孕这件事人家自...
    星享加阅读 341评论 0 0