当前位置: 移动技术网 > IT编程>网页制作>Html5 > HTML5中的Canvas绘图

HTML5中的Canvas绘图

2020年07月14日  | 移动技术网IT编程  | 我要评论

canvas简介

canvas时HTML5提供的一种新标签,它本身不具备绘图功能,主要通过JavaScript的脚本来进行图片的绘制。它只是一个图形容器,是一个矩形区域画布,其默认在页面的大小是width:300px;height:100px;其上图形的绘制需要借助javascript来实现。
兼容性
IE9以上以及chrome,ff,苹果的浏览器都支持,只要浏览器兼容canvas,那么就会支持绝大部分API。2d效果的大部分都支持,3d效果除IE11以下,其他的浏览器都是支持的。在写代码时最好加上友好提示:
<canvas id="this_canvas">您的浏览器不支持canvas,请升级浏览器显示此行文本</canvas>
这里有一些注意事项:
1、不要用css控制它的宽和高,不然会出现图片拉伸。
2、重新设置canvas标签的宽高属性会擦除掉画布的所有内容。
3、canvas画布是可以设置背景色的。

canvas使用方法

1、首先获取canvas对象;
2、开始设置画布尺寸,请注意,画布尺寸一定要提前设置,不然其中的内容会被擦除。
3、然后将画布转化为2d模型。
4、然后使用各种API进行绘制。
如下面代码:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        *{
            margin:0;
            padding:0;
        }
        #myCanvas{
            border:1px solid #000;
        }
    </style>
</head>
<body>
<canvas id="myCanvas">您的浏览器不支持canvas,请升级浏览器浏览器后查看此行文本</canvas>
<script>
    //首先要获取canvas对象
    var myCanvas=document.querySelector("#myCanvas");
    
    //其次开始设置画布尺寸,请注意,画布尺寸一定要提前设置,不然其中的内容会被擦除。
    myCanvas.width=900;
    myCanvas.height=600;
    
    //然后将画布转化为2d模型
    var drawing=myCanvas.getContext("2d");
    
    //然后使用各种API进行绘制。
    
</script>
</body>
</html>

常用接口简介

方法:

fill();
填充形状内部。
使用方法:变量名.fill(); 变量名.fill(fillRule); 变量名.fill(path,fillRule);
其中,fillRule是填充规则,用来确定一个点是在路径内还是路径外。可选的值包括nonzero(非零规则【默认】)和evenodd(奇偶规则),这里不赘述,详情就请参见canvas官网介绍。
stroke();
对路径进行描边。
用法:变量名.stroke
strokeStyle();
用来设置描边样式,使用方法: 变量名.strokeStyle=color/gradient/pattern可以设置描边为颜色,渐变,图案。
save();
存储当前的canvas画布状态,并放置到堆栈顶端,之后可以用restore方法依次取出。
使用方法:变量名.save();
restore();
将堆栈中保存的画布状态依次弹出,如果没有存储的canvas状态,则该方法没有任何作用。
使用方法:变量名.restore();没有返回值,没有参数。
clearReact();
把canvas元素画布中的矩形区域变成透明的,多用来不断清除画布进行再绘制。使用方法:变量名.clearReact(x,y,width,height);其中x,y分别对应要清除的矩形的左上角的横纵坐标,width表示被清除的矩形区域的高度,height表示被清除的矩形区域的宽度。

矩形

rect();
绘制矩形路径,使用方法同下面两个矩形,要注意的是,使用它绘制出来的仅仅是路径,要是不使用fill进行填充或者使用storke进行描边操作,那么该矩形不会在画布上显示出来。
fillRect();
矩形填充。使用方法:变量名.fillRect(x,y,width,height);其中参数分别代表:填充矩形的起始横坐标,纵坐标,宽度和高度。
strokeRect();
矩形描边效果,使用方法:变量名.strokeRect(x,y,width,height);其中参数分别代表:描边矩形的起始横坐标,纵坐标,宽度和高度。

    drawing.fillStyle="pink";
    drawing.fillRect(50,50,100,100);
    drawing.fill();

    drawing.restore();//重新取用第一次存储的状态。
    drawing.fillStyle="green";
    drawing.fillRect(200,50,100,100);
    drawing.fill();

    drawing.restore();
    drawing.strokeStyle="red";//颜色设置要在描边之前,不然颜色不会加到边上去。
    drawing.strokeRect(350,50,100,100);
    drawing.stroke();

结果如下图:
在这里插入图片描述

文本

filltext();
主要用来绘制填充文本。使用方法:变量名.fillText(text,x,y,[maxwidth(可选)]);其中,text是所要填充的文本内容,x和y分别是填充文本的起点横纵坐标,maxwidth可选填,代表填充文本所占据的最大宽度,若是超过最大宽度,则通过压缩文本宽度进行适配而不是换行。
strokeText();
文本描边效果,此描边为居中描边。使用方法同上。
font=value;
用来设置字体样式,使用方法例如:变量名.font="50px 幼圆"。

    drawing.restore();
    drawing.strokeStyle="purple";
    drawing.font="50px 幼圆"
    drawing.strokeText("我是一只不平凡的鸡",200,300,400);
    drawing.stroke();

    drawing.fillStyle="pink";
    drawing.font="微软雅黑 100px";
    drawing.fillText("微软雅黑",500,400,800);
    drawing.fill();

结果如下:
在这里插入图片描述
在这里插入图片描述

圆形

arc();
绘制圆弧,也可用它来绘制正圆。使用方法:变量名.arc(x,y,radius,startAngle,endAngle,[anticlockwidse]);其中参数分别对应圆弧的圆心很纵坐标,圆弧的半径大小,圆弧的开始角度和结束角度,圆弧从开始到结束按照顺时针还是逆时针计算,若为true则为逆时针,若为false则为顺时针。
arcTo();
给路径添加圆弧,需要指定控制点和半径。使用方法:变量名.arcTo(x1,y1,x2,y2,radius);其中参数分别对应第一个控制点的横纵坐标,第二个控制点的横纵坐标,以及圆弧的半径大小。
ellipse();
用来绘制椭圆,但此方法ie浏览器暂不支持。使用方法:变量名.ellipse(x,y,radiusX,radiusY,rotation,startAngle,endAngle,anticlockwise);其参数分别为:椭圆对应的圆心横纵坐标,长轴半径大小,短轴半径大小,椭圆的旋转角度单位是弧度,圆弧开始的角度(单位是弧度),圆弧结束的角度(单位是弧度),绘制方向是顺时针还是逆时针true是逆时针。

    drawing.restore();
    drawing.strokeStyle="blue";
    drawing.arc(400,500,100,0,Math.PI/2,true);
    drawing.stroke();
    drawing.save();

    drawing.restore();
    drawing.beginPath();
    drawing.strokeStyle="red";
    drawing.ellipse(100,400,100,50,0,Math.PI*2,false);
    drawing.stroke();
    drawing.closePath();
    drawing.save();

线条绘制

路径:beginpath()和closepath()结合起来用来区分不同的路径绘制。没有参数和返回值。beginpath是开始路径,closepath是结束路径。
直线:moveTo()和lineTo()结合起来用来绘制直线,以连接当前和最后的子路径点。moveto为开始路径,lineto为结束路径。其中的参数x,y分别对应绘制的直线落点的横纵坐标。
线条宽度
表示线宽,默认为1.0。可以用来改变线的宽度。使用方法:变量名.lineWidth=value;

    drawing.restore();
    drawing.strokeStyle="pink";
    drawing.beginPath();
    drawing.moveTo(300,300);
    drawing.arcTo(350,300,400,450,50);
    drawing.arcTo(350,450,450,500,50);
    drawing.lineTo(500,500);
    drawing.stroke();
    drawing.closePath();

图形变换

transform()
对当前坐标系进行变换,以实现缩放旋转拉伸或者唯一的效果。使用方法:变量名.tansform(a,b,c,d,e,f);其参数分别对应,水平缩放,水平斜切,垂直斜切,垂直缩放,水平位移,垂直位移。
translate()
对canvas整体坐标系进行位移。其中参数x,y分别为坐标系水平位移的距离和坐标系垂直位移的距离。
rotate()
给canvas画布,添加旋转矩阵,顺时针方向,单位为弧度。默认旋转中心点是canvas左上角的0,0坐标点。使用方法:变量名.rotate(angle);
这里,如果想要以图片中心旋转,则需要先用translate进行坐标位移,然后将其旋转45度,再位移回来,此时绘制的图片就是中心旋转了。
scale();
缩放canvas画布坐标系,只影响坐标系及之后绘制的图形,之前已经绘制好的效果不会有任何变化。,默认缩放中心是0,0。其中参数分别为,x水平缩放的比例,小数也可以,如果值为负数,表示水平翻转,y垂直缩放的比例,如果值为负数,表示垂直翻转。
clip()
路径裁剪,使用时先绘制裁剪路径,再执行这个方法,就可以剪裁出路径样式的图片。即可以用剪裁实现一个图案效果填充。

//官网上有这样一段代码,用clip来实现一个三角形路径里填充图片
这里要记住,将那个变量设置为2d模型,后面就要用该变量,否则就加不上去。
var context=canvas.getContext('2d');
var img=new Image();
img.onload=function(){
	context.beginPath();
	//绘制三角形
	context.moveTo(20,20);
	context.lineTo(200,80);
	context.lineTo(110,150);
	//剪裁
	context.clip();
	//填充图片
	context.drawImage(img,0,0,250,167);
	context.closePath();
};
	img.src='./1.jpg';

在这里插入图片描述

//利用裁切功能绘制拼图验证
    var img = new Image();
    img.onload = function () {
        drawing.beginPath();
        drawing.rect(50, 300, 100, 100);
        drawing.lineTo(75, 300 );
        drawing.arcTo(100, 275, 125, 300, 25);
        drawing.lineTo(125, 300);
        drawing.clip();
        drawing.drawImage(img, 0, 0, 900, 900);
        drawing.closePath();
    }
    img.src = "https://dss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1554589653,233370381&fm=26&gp=0.jpg";

在这里插入图片描述

渐变

createLinearGradient()
用来创建线性渐变对象,注意,在这里,渐变坐标是全局的,而不是相对于填充元素计算的。使用方法:context.createLinerGradient(x0,y0,x1,y1);其中,参数分别为,渐变起始点横纵坐标,渐变终止点横纵坐标。
createRadialGradient()
用来创建径向渐变,它的起始点由两个圆环坐标构成而非点坐标。使用方法:变量名.createRadialGradient(x0,y0,r0,x1,y1,r1);其参数分别为,第一个圆环的中心坐标和半径,第二个圆环的中心坐标及半径。

 	drawing.beginPath();
 	//设置线性渐变方向和渐变色所占比重。
    var jianbian=drawing.createLinearGradient(200,300,500,400);
    jianbian.addColorStop(0.1,"red");
    jianbian.addColorStop(0.3,"blue");
    jianbian.addColorStop(0.6,"pink");
    jianbian.addColorStop(0.9,"green");
    drawing.fillStyle=jianbian;
    //上色
    drawing.fillRect(200,300,100,100);
	drawing.closePath();

    drawing.restore();
    drawing.beginPath();
     	//设置径向渐变方向和渐变色所占比重。
    var jingxiang=drawing.createRadialGradient(400,400,50,400,400,100);
    jingxiang.addColorStop(0.1,"red");
    jingxiang.addColorStop(0.3,"blue");
    jingxiang.addColorStop(0.6,"pink");
    jingxiang.addColorStop(0.9,"green");
    //绘制圆弧
    drawing.arc(400,400,100,0,Math.PI*2,false);
    drawing.fillStyle=jingxiang;
    drawing.fill();
    drawing.closePath();
//渐变文本边框
    var wenzi=drawing.createLinearGradient(50,200,400,200);
    wenzi.addColorStop(0.2,"purple");
    wenzi.addColorStop(0.4,"blue");
    wenzi.addColorStop(0.6,"green");
    wenzi.addColorStop(0.8,"yellow");
    drawing.strokeStyle=wenzi;
    drawing.font="80px 幼圆";
    drawing.strokeText("canvas是我们的希望",50,200,400);
    drawing.stroke();

结果如下图:

在这里插入图片描述

阴影

shadowBlur
用来指定阴影的模糊程度,默认值是0,表示不模糊。使用方法:context.shadowBlur=value;会忽略负数,NaN。
shadowcolor
用来指定阴影的颜色,默认值为透明黑,也就是看不到颜色,所以要是想要看到阴影效果,必须指定颜色。使用方法:变量名.shadowcolor=color;
shadowoffsetX
表示阴影的水平偏移大小。使用方法:变量名.shadowOffsetX=offset;offset表示偏移的大小。
shadowoffsetY
表示阴影的垂直偏移大小。

var wenzi=drawing.createLinearGradient(50,200,400,200);
    wenzi.addColorStop(0.2,"purple");
    wenzi.addColorStop(0.4,"blue");
    wenzi.addColorStop(0.6,"green");
    wenzi.addColorStop(0.8,"yellow");
    drawing.strokeStyle=wenzi;
    drawing.shadowColor="lightgray";
    drawing.shadowBlur=4;
    drawing.shadowOffsetX=20;
    drawing.shadowOffsetY=20;
    drawing.font="80px 幼圆";
    drawing.strokeText("canvas是我们的希望",50,200,400);
    drawing.stroke();

在这里插入图片描述

杂类

drawImage()
寻找一个区域用来放置图形, 一般用来做水印。使用方法:变量名.drawImage(image,sx,sy,sWidth,sHeight,dx,dy,dWidth,Dheight);其参数为:图片元素,图片元素绘制在画布上的起始横纵坐标;图片元素从坐标点开始算,多大的内容绘制在画布上(其实就是剪裁图片上的某一部分作为绘制内容。);图片元素放置在画布上的区域的横纵坐标,以及区域的宽高。
getImageData()
返回一个inmagedata对象,其中包含canvas画布部分或者完整的像素点信息。用来处理像素级的信息。比如将一个绘制好的canvas图像中间的一部分变色。使用方法:变量名.getinmagedata(sx,sy,swidth,sheight);其中的参数,分别为需要返回的图像数据区域的起始横纵坐标,需要返回的图像数据区域的宽高。
createImageData()
创建一个全新的空的图片对象,该对象中所有像素都是透明黑。使用方法:变量名.createImagedata(width,height);其参数分别为图像最终呈现的宽高。
createPattern()
用来创建图案对象,可以指定平铺方式。使用方式:变量名.createPattern(image,repetition);其中参数分别为用来平铺的对象以及平铺方式。平铺方式有:repeat-x和repeat-y水平和垂直平铺,如果没有区分x和y则为都平铺。no-repeat为不平铺。
globalAlpha()
设置全局透明度,范围是0-1.使用方法:变量名.globalAlpha=value;

本文地址:https://blog.csdn.net/weixin_44759795/article/details/107254908

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网