canvas初级

绘图操作
canvas本身不具备画图能力,一切都通过js
兼容:ie9+ chrome FF
oC = document.querySelector('canvas);
获取画笔: var gd=oC.getContext('2d');

起始点:    gd.moveTo(x,y) 
连接到哪:   gd.lineTo(x,y) 
描边: gd.stroke(); 
描边颜色:   gd.strokeStyle='rgba/rgb/#f00/red'; 
填充: gd.fill(); 
填充颜色:   gd.fillStyle(); 
闭合路径 (自动连接到起始点):        gd.closePath(); 
开始路径 (开始绘制一个新的图案,屏蔽之前 ):    gd.beginPath(); 
画图基本流程
    gd.beginPath();
    画图
    gd.closePath();
    gd.storke(); 
矩形 :    gd.strokeRect(x,y,w,h); 
矩形填充:gd.fillStyle 
圆:  gd.arc(cx,cy,r,起始角度,结束角度,是否逆时针); 
画文字:    gd.strokeText(文字,x,y);
水平居中:gd.textAlign='center/left/right';
垂直居中:gd.textBaseline='middle/top/bottom';
获取文字宽度:gd.measureText(str).width
    清除画布:gd.clearRect(0,0,oC.width,oC.height);

端点样子
    gd.lineCap='round';
        butt        默认值
        round       圆
        square      方
连接点的样子
    gd.lineJoin='bevel';
        bevel       斜切
        round       圆
        miter       默认值 
事件
     需要模拟 if(ev.clientX>x&&ev.clientX<x+w&&ev.clientY>y&&ev.clientY<y+h){}
    阴影:
        gd.shadowOffsetX=10;        x
        gd.shadowOffsetY=10;        y
        gd.shadowColor='red';       color
        gd.shadowBlur=2;            模糊度
    渐变
        gd.createLinearGradient(x1,y1,x2,y2); 
        linear.addColorStop(位置,颜色); 
  径向渐变
    gd.createRadialGradient(x1,y1,r1,x2,y2,r2);

平铺背景
        gd.createPattern(oImg,'no-repeat');
        gd.drawImage(oImg,200,100);
导出图片
        oC.toDataURL('image/gif');
画图片
    完美用法  :
    gd.drawImage(img,
        sx,sy,swidth,sheight,
        x,y,width,height
  ); 
draw.png
   像素级操作
          var result=gd.getImageData(0,0,oC.width,oC.height);
           var d=result.data;
          gd.putImageData(result,0,0); 

简易的画图板:

        var oC = document.querySelector('canvas');
        var gd = oC.getContext('2d');
        oC.onmousedown = function(ev){ 
            gd.beginPath();
            gd.moveTo(ev.clientX,ev.clientY);
            oC.onmousemove = function(ev){
                gd.lineTo(ev.clientX,ev.clientY);
                gd.stroke();
            }
            oC.onmouseup = function(){
                oC.onmousemove = null;
                oC.onmouseup = null;
            }
            return false;
        }

简易柱状图:

function rnd(n,m){
    return Math.floor(Math.random()*(m-n)+n);   
}
window.onload=function (){
    var oC=document.querySelector('canvas'); 
    var gd=oC.getContext('2d'); 
    var arr=[300,200,50,80,150,900]; //模拟后台数据
    var iMax=Math.max.apply(null,arr); //找到数组中最大的
    //求出每个柱子的高度
    var aHeight=[]; 
    for(var i=0; i<arr.length; i++){
        aHeight[i]=arr[i]/iMax*oC.height;
    } 
    //画柱子
    var w=50; 
    for(var i=0; i<aHeight.length; i++){
        gd.beginPath();
        gd.fillStyle='rgb('+rnd(0,256)+','+rnd(0,256)+','+rnd(0,256)+')';
        gd.fillRect(i*w*2,oC.height-aHeight[i],w,aHeight[i]);
    }
};

简易饼状图:

         function rnd(n,m){
            return Math.floor(Math.random()*(m-n)+n);
        }
        function d2a(n){//度数转弧度
            return n*Math.PI/180;
        }
        window.onload = function(){
            var oC = document.querySelector('canvas');
            var gd = oC.getContext('2d');
            var arr = [3,5,7,8,4];//模拟后天数据
            var sum = 0;   //总数量
            for(var i = 0;i < arr.length;i++){
                sum += arr[i];
            }
            var aDeg = [];//每一项所占的度数
            for(var i = 0;i < arr.length;i++){
                aDeg[i] = arr[i]/sum*360;
            }
            //画圆
            function drawPie(start,end){
                gd.beginPath();
                gd.fillStyle='rgb('+rnd(0,256)+','+rnd(0,256)+','+rnd(0,256)+')';
                gd.moveTo(200,200);
                gd.arc(200,200,100,d2a(start),d2a(end),false);
                gd.fill();
            }
            var d=0;
            for(var i = 0;i < aDeg.length;i++){
                console.log(d);
                drawPie(d,d+aDeg[i]);
                d += aDeg[i];
            }
        }

运动(开定时器,改变left top )

     var oC=document.querySelector('canvas'); 
     var gd=oC.getContext('2d'); 
     var x=100;
     setInterval(function (){
            gd.clearRect(0,0,oC.width,oC.height);
            gd.strokeRect(x++,100,100,100);
   },30);

导出图片

<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<title></title>
<style>
body{ background:#000; }
canvas{ background:#fff; }
</style>
<script>
function d2a(n){
    return n*Math.PI/180;
}
window.onload=function(){
    var oC=document.querySelector('canvas');
    var gd=oC.getContext('2d'); //画笔
    var linear=gd.createLinearGradient(-300,-300,300,200);

    linear.addColorStop(0,'red');
    linear.addColorStop(1,'yellow');

    gd.strokeStyle=linear;
    var d=0;
    setInterval(function(){
        gd.save();
        gd.translate(200,150);
        gd.rotate(d2a(d++));
        gd.strokeRect(-100,-50,200,100);
        gd.restore();
    },16);
    //导出图片
    var oBtn=document.getElementById('btn1');
    oBtn.onclick=function(){
        var res=oC.toDataURL('image/gif');
        var oImg=new Image();
        oImg.src=res;
        document.body.appendChild(oImg);

    };
};
</script>
</head>
<body>
    <input type="button" value="按钮" id="btn1" />
    <canvas width="400" height="300"></canvas>
</body>
</html>

平铺图片:

var oC=document.querySelector('canvas');
    var gd=oC.getContext('2d'); //画笔

    var oImg=new Image();

    var n=0;

    oImg.onload=function (){
        setInterval(function (){
        gd.clearRect(0,0,oC.width,oC.height);
            gd.drawImage(oImg,
                0,n*60,60,60,   //截取图片
                100,100,120,120//改变图片位置和大小
            );
            n++;
            if(n==10){
                n=0;
            }
        },30);
    };

    oImg.src='coinAni2.png';

图片阴影:

var oC=document.querySelector('canvas');
    
    var gd=oC.getContext('2d');
    
    gd.shadowOffsetX=10;
    gd.shadowOffsetY=10;
    gd.shadowColor='red';
    gd.shadowBlur=2;
    
    gd.font='100px a';
    gd.strokeText('前端开发',200,200);

径向渐变

function d2a(n){
    return n*Math.PI/180;
}
window.onload=function (){
    var oC=document.querySelector('canvas');
    
    var gd=oC.getContext('2d');
    
    var linear=gd.createRadialGradient(400,400,340,400,400,200); 
    linear.addColorStop(0,'#f00');
    linear.addColorStop(0.1,'orange');
    linear.addColorStop(0.3,'yellow');
    linear.addColorStop(0.5,'green');
    linear.addColorStop(0.8,'blue');
    linear.addColorStop(0.9,'purple');
    linear.addColorStop(1,'#fff'); 
    gd.fillStyle=linear;
    gd.lineWidth=100;
    gd.arc(400,400,340,d2a(-180),d2a(0),false);
    gd.fill();
};

像素级操作

function testPixel(){
 var canvas = document.getElementById('lesson01');
 var c = canvas.getContext('2d');

 var img = new Image();

img.onload = function() {
    //draw the image to the canvas
    c.drawImage(img,0,0);
    //get the canvas data
    var data = c.getImageData(0,0,canvas.width,canvas.height);
    //invert each pixel
    for(n=0; n<data.width*data.height; n++) {
        var index = n*4;
        data.data[index]   = 255-data.data[index];
        data.data[index+1] = 255-data.data[index];
        data.data[index+2] = 255-data.data[index];
        //don't touch the alpha
    }

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

推荐阅读更多精彩内容

  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,679评论 2 32
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    Looog阅读 3,941评论 3 40
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    J_L_L阅读 1,516评论 0 4
  • 前一篇讲到了一些canvas的基础知识,今天,咱们就来深入了解下canvas。 初次见到canvas,发现它的宽高...
    余继莲阅读 160评论 0 0
  • 一、基础介绍和画直线 大多数现代浏览器都是支持Canvas的,比如 Firefox, safari, chrome...
    空谷悠阅读 841评论 0 1