Canvas绘图

基本用法
1、要使用canvas,必需先设置其width和height属性,指定绘图的大小,中间内容是后备信息,不支持的浏览器才显示

<canvas id='drawing' width='200' height='200'> a drawing of something </canvas>

2、要在这块画布上绘图,需要取得绘图上下文,而取得绘图上下文的调用,需要调用getContext()方法,传入2d

var drawing = document.getElementById('drawing);
//确定浏览器支持<canvas>元素
if(drawing.getContext){
    var context = drawing.getContext('2d');
    //do sth
}


3、使用toDataURL()方法,可以导出再<canvas>元素上绘制的图像,比如:要取得画布中的一幅png格式的图像

var drawing = document.getElementById('drawing);
//确定浏览器支持<canvas>元素
if(drawing.getContext){
    //取得图像的数据URI
    var imgURI = drawing.toDataURL('image/png');
    //显示图像
    var image = document.createElement('img');
    image.src = imgURI;
    document.body.appendChild(image);
}

2D上下文

填充和描边
填充:fillStyle属性,用指定的样式(颜色,渐变,图像)填充图形
描边:strokeStyle属性,只在图形的边缘画线

var drawing = document.getElementById('drawing');
//确定浏览器支持<canvas>元素
if(drawing.getContext){
    var context = drawing.getContext('2D');
    context.strokeStyle = '#0000ff';
    context.fillStyle = 'red';
}

他们指定表示颜色的字符串值,可以使用css中指定颜色值的任何格式,包括颜色名,十六进制,rgb , rgba , hsl , hsla。

绘制矩形
矩形是唯一一种可以直接再2d上下文绘制的形状。与矩形有关的方法fillRect(),strokeRect(), clearRect()。
这三个方法接收4个参数,矩形的x坐标,矩形的y坐标,矩形宽度和矩形高度

fillRect():在画布绘制的矩形会填充指定的颜色
strokeRect():在画布上绘制的矩形会使用指定的颜色描边
clearRect():清除画布上的矩形区域

var drawing = document.getElementById('drawing');
//确定浏览器支持<canvas>元素
if(drawing.getContext){
    var context = drawing.getContext("2d");

    //绘制红色矩形
    context.fillStyle = "#ff0000";
    context.fillRect(10, 10, 50, 50);
    context.strokeStyle = "#0000ff";
    context.strokeRect(10,10,50,50);

    //绘制半透明的蓝色矩形
    context.fillStyle = "rgba(0, 0, 255, 0.5)";
    context.fillRect(30, 30, 50, 50);
    context.strokeStyle = "#ff0000";
    context.strokeRect(30,30,50,50);

    //在两个矩形重叠的地方消除一个小矩形
    context.clearRect(30, 30, 30, 30);
}

绘制一个不带数字的时钟表盘
要绘制路径,首先必须调用beginPath()方法,表示要开始绘制新路径
arc(x, y, radius, startAngle, endAngle, counterclockwise):以(x,y)为圆心绘制一条弧线,弧线半径为radius,
起始和结束角度(用弧度表示)分别为startAngle和endAngle。最后一个参数表示startAngle和endAngle是否按逆时针方向计算,
值为false表示按顺时针方向计算
moveTo(x, y):将绘图游标移动到(x,y),不画线
lineTo(x,y):从上一点开始绘制一条线,到(x,y)为止

var drawing=document.getElementById("drawing"); 
//确定浏览器支持<canvas>元素
if(drawing.getContext){
    var context = drawing.getContext("2d");

    //开始路径
    context.beginPath();

    //绘制外圆
    context.arc(100, 100, 99, 0, 2 * Math.PI, false); 
    //PI在数学方法中为π,而此时的π在角度里为180°,Math.PI/180就为1°

    //绘制内圆
    context.moveTo(194, 100);
    context.arc(100, 100, 94, 0, 2 * Math.PI, false);

    //绘制分针
    context.moveTo(100, 100);
    context.lineTo(100, 15);

    //绘制时针
    context.moveTo(100, 100);
    context.lineTo(35, 100);

    //描边路径
    context.stroke();
}    


绘制文本
font:表示文本样式,大小及字体。
textAlign:表示文本对齐方式。注意左右用'start'和'end'。可能的值有'start','end','left','right','center'
textBaseline:表示文本的基线。 可能的值有'top','middle','bottom','hanging','alphabetic','ideogrphic'

context.font = "bold 14px Arial";
context.textAlign = "center";
context.textBaseline = "middle";
context.fillText("12", 100, 20);

如果需要把文本控制在某一区域中的时候,2d上下文提供了辅助确定文本大小的方法measureText()。这个方法接收一个参数,既要绘制的文本。

返回的对象目前只有一个width属性,但将来还会增加更多度量属性

var fontSize = 100;
context.font = fontSize + 'px Arial';
while(context.measureText('Hello word').width > 100){
    fontSize--;
    context.font = fontSize + 'px Arial';
}
context.fillText('Hello word', 170, 150);
context.fillText('Font size is ' + fontSize + 'px', 210, 120);


绘制变换
translate(x,y):将坐标原点移动到(x,y)。执行这个变换后,坐标(0,0)会变成之前的(x,y)表示的点。

context.translate(100,100)

rotate(angle):围绕原点旋转图像angle弧度

context.rotate(1); //以弧度为单位,360°角=2π弧度,1弧度=57.3°角,1°角=π/180弧度

绘制图像
如果想要把一幅图像绘制到画布上,可以使用drawImage()方法。调用这个方法时,有三种不同的参数组合
1)drawImage(image, 10, 10):表示绘制的源图像起点的坐标10,10,这里没有指定大小,所以与原始大小一样
2)drawImage(image, 10, 10, 50, 50):后面新增的两个参数表示图像大小是50*50像素
3)drawImage(image, 10, 10, 50, 50, 100, 100, 20, 20):后面新增的四个参数表示目标图像的起点(100,100),目标图像的大小20*20像素

var image = new Image();
image.src='timg.jpeg';
image.onload = function(){ //需要图片装载完后才能使用此图片
    context.drawImage(image, 0, 0, 200, 200);
}

绘制阴影
2D上下文会根据以下几个属性的值,自动为形状或路径绘制出阴影
shadowColor: 用css颜色格式表示的阴影颜色,默认为黑色。
shadowOffsetX: 形状或路径x轴方向的阴影偏移量,默认为0
shadowOffsetY: 形状或路径y轴方向的阴影偏移量,默认为0
shaodowBlur: 模糊的像素数,默认为0, 即不模糊。

//绘制阴影
context.shadowColor = 'rgba(0, 0, 0, 0.5)';
context.shadowOffsetX = 5;
context.shadowOffsetY = 5;
context.shaodowBlur = 4;

绘制渐变
1)渐变
渐变由CanvasGradient实例表示,要创建一个新的线性渐变,可以调用createLinearGradient()方法,这个方法接收4个参数
起点的x坐标,起点的y坐标,终点的x坐标,终点的y坐标。调用后就会创建一个指定的渐变。
创建渐变后,就是使用addColorStop()方法来指定色标,这个方法接收两个参数:色标位置和CSS颜色值。色标位置是一个0(开始的颜色)
到1(结束到颜色)之间到数字

//绘制渐变
var gradient = context.createLinearGradient(30, 30, 70, 70);
gradient.addColorStop(0, "white");
gradient.addColorStop(1, "black");
//绘制半透明的蓝色矩形
context.fillStyle = gradient;
context.fillRect(30, 30, 50, 50);

为了覆盖整个矩形,矩形和渐变到坐标必须匹配才行

//绘制渐变
var gradient = context.createLinearGradient(30, 30, 70, 70);
gradient.addColorStop(0, "white");
gradient.addColorStop(1, "black");
//绘制半透明的蓝色矩形
context.fillStyle = gradient;
context.fillRect(50, 50, 50, 50);

这样只会显示部分渐变效果,只有左上角到一点白色,这是因为矩形的起点位于渐变的中间位置,而次渐变已经快结束了。
确保渐变的形状对齐非常重要,有时候可以考虑使用函数来确保坐标

function createRectLinearGradient(context, x, y, width, height){
    return context.createLinearGradient(x, y, x+width, y+height);
}

2)径向渐变(或放射渐变)
使用createRedialGradient()方法。这个方法接收6个参数,前三个参数是起点圆的坐标和半径,后三个参数是终点圆的原心坐标和半径

//绘制放射渐变
var gradient = context.createRadialGradient(55, 55, 10, 55, 55, 30);
gradient.addColorStop(0, "white");
gradient.addColorStop(1, "black");
//绘制渐变矩形
context.fillStyle = gradient;
context.fillRect(30, 30, 50, 50);

因为创建比较麻烦,所以径向渐变并不那么容易控制,一般来说,让起点圆和终点圆保持为同心圆的情况比较多,这个时候只要考虑两个
圆多设置不同的半径就好了。


模式
模式就是重复的图像,要创建一个新模式,可以调用createPattern()方法并传入两个参数:一个html元素和一个表示重复
图像的字符串

var context = drawing.getContext("2d");
var image = new Image();
image.src='1.jpg';
image.onload = function(){ 
    var pat = context.createPattern(image,"repeat");
    context.fillStyle=pat;
    context.fillRect(0,0,500,500);
}
原文地址:https://www.cnblogs.com/wzndkj/p/8526294.html