canvas

一、canvas 概述css

画布<canvas>元素是 HTML5 中的新元素,能够经过JavaScript 在页面中指定的区域绘制图形html

<canvas id="canvas" width="400px" height="500px">画布,你的浏览器不支持canvas,请更新浏览器</canvas>

canvas 须要设置 width 和 height 属性,若是没有设置这两个属性,width 和 height 有默认值(300,150)。若是经过style 设置 width 、height,则图形有可能会拉伸变形,参见该文章canvas

使用canvas的步骤:一、取得canvas元素对象 ;二、经过canvas 元素对象的 getContext("2d") 取得绘图2d上下文对象的引用;三、使用上下文的各类属性和方法来绘制图片。数组

2d上下文的坐标起始于 canvas 的左上角,原点坐标是 (0 , 0) 。浏览器

let imgURL = canvas.toDataURL("image/png");  //toDataURL() 是canvas对象的方法,导出画布上的图像
let img = document.createElement("img");
img.src = imgURL;
imgDiv.appendChild(img);

二、绘图上下文对象的属性和方法app

fillStyle:该属性指定填充的样式(颜色,渐变对象,图像),值能够是字符串,渐变对象,模式对象,默认值是 “#000000”。若是是指定颜色的字符串,能够是任何CSS中指定颜色的格式ide

strokeStyle:该属性指定描边的样式,值能够是字符串,渐变对象,模式对象,默认值是 “#000000”。若是是指定颜色的字符串,能够是任何CSS中指定颜色的格式字体

 

fillRect( x, y, w, h):填充一个矩形,并指定坐标 (x , y),宽高 w 、h。其填充的颜色是经过 fillStyle 属性设置的spa

strokeRect( x, y, w, h):绘制一个矩形,没有填充rest

clearRect( x, y, w, h):将画布上的指定矩形区域清空,能够去掉以前绘制的图形

lineWidth:指定线条的宽度,能够是任何整数

lineCap:指定线条末端的形状,能够是 "butt"(平头),"round"(圆头),"square"(方头)

lineJoin:指定线条相交的方式,能够是 "round"(圆交),"bevel"(斜交),"miter"(斜接)

 

beginPath():表示开始绘制路径,在绘制路径以前必须先调用该方法

arc( x, y, radius, startAngle, endAngle, counterclockwise):以 (x , y) 为圆心绘制一条半径为 radius 的弧线,弧线的起始、截止角度分别是 startAngle,endAngle(角度是以弧度表示的),

counterclockwise表示是否按逆时针方向开始绘制(false是顺时针方向),角度的零弧度在x轴右侧

arcTo( x1, y1, x2, y2, radius):绘制一条 半径为 radius 的弧线 穿过 (x1 , y1) ,(x2 , y2)两个点

bezierCurveTo(c1x, c1y, c2x, c2y, x, y):绘制三次贝塞尔曲线,(c1x, c1y),(c1x, c1y) 是控制点1,控制点2的 坐标,(x, y) 是终点的的坐标

quadraticCurveTo(c1x, c1y, x, y):绘制二次贝塞尔曲线,(c1x, c1y),控制点的 坐标,(x, y) 是终点的的坐标

moveTo(x , y):把画笔移动到指定的坐标(x, y)。至关于设置路径的起始点坐标。

lineTo(x , y):绘制直线,从上一点开始到点 (x , y)

rect( x, y, w, h):绘制矩形路径,(不是独立的形状)

closePath():闭合路径,绘制一条链接路径起点和终点的直线,闭合路径以后,图形绘制命令又从新指向到上下文中

stroke():经过线条来绘制图形轮廓

fill():经过填充路径的内容区域生成实心的图形

clip():能够在路径上建立一个剪切区域,剪切区的大小是以前路径的范围。一旦剪切了某个区域,则全部以后的绘图都会被限制在被剪切的区域内(不能访问画布上的其余区域),被剪切区域内图形部分是可见的。

能够在使用 clip() 方法前经过使用 save() 方法对当前画布区域进行保存,并在之后的任意时间对其进行恢复(经过 restore() 方法)

 

font:该属性用于设置绘制文本的字体、大小、样式,用css中字体格式设置方式,"bold 14px Arial"

textAlign:设置文本你的水平对齐方式,可选值:"start","end","left","right","center"

textBaseline:表示文本的基线,设置垂直对齐方式,可选值:"top","hanging","middle","alphabetic","ideographic","bottom"

fillText(string, x, y [,maxWidth]):填充式绘制文本(实体的)

strokeText(string, x, y [,maxWidth]):描边式绘制文本(中空的)

measureText(string):辅助肯定文本大小,接受一个要绘制的文本,返回TextMetrics对象,该对象有一个 width 属性,表示在当前文本字体样式下,文本绘制时须要的宽度

 

rotate(angle):变换矩阵,围绕远点旋转 angle 弧度

scale(scaleX, scaleY):缩放图像,在x,y方向上分别乘以缩放比例,默认缩放比例是1.0

translate(x , y):变换矩阵,将坐标原点移动到(x, y)

transform(m1_1, m1_2, m2_1, m2_2, dx, dy):直接变换修改变换矩阵,修改方式是,乘以矩阵 

m1_1     m1_2    dx

m2_1     m2_2    dy

0            0           1

setTransform(m1_1, m1_2, m2_1, m2_2, dx, dy):将变换矩阵重置为默认状态,而后再调用 transform()

 

save():保存当前全部设置,而后可进行新的设置,绘制新样式的图形

restore():恢复以前保存的设置,使用以前的设置绘图,save() 和 restore() 能够嵌套配合使用

 

drawImage(image, targetX, targetY [, targetW, targetH] ):将图像绘制到画布中,参数:图像对象,画布中图像的起点的 x 坐标,图像起点的 y 坐标,图像的高度,图像的宽度;最后两个参数能够不用设置,这样绘制出来的图像的高度和高度和原图同样

drawImage(image,sourceX, sourceY, sourceW, sourceH, targetX, targetY, targetW, targetH ):绘制图像,能够将原图中的一部分绘制到画布上,

参数:图像对象,原图像的起点的 x 坐标,原图像起点的 y 坐标,原图像的高度,原图像的宽度,目标图像的起点的 x 坐标,目标图像起点的 y 坐标,目标图像的高度,目标图像的宽度;

 

shadowColor:设置阴影颜色,css颜色格式,默认黑色

shadowOffsetX:x 轴方向的阴影偏移量,默认为0

shadowOffsetY:y 轴方向的阴影偏移量,默认为0

shadowBlur:模糊的像素度,默认为0(不模糊)

 

createLinerGradient(startX, startY, endX, endY):建立线性的渐变对象,参数:起点x坐标,起点y坐标,终点x坐标,终点y坐标

createRadialGradient(x0, y0, r0, x1, y1, r1):建立径向渐变对象,参数:起点圆心坐标x0,y0,半径r0,终点圆心坐标x1,y1,半径r1

获得渐变对象后,须要使用渐变的对象的 addColorStop(flag, colorString)方法,设置渐变开始和结束的颜色,flag只能是0 或 1 ,0表示开始,1表示结束。而后将渐变对象赋给 上下文的 fillStyle 或者 strokeStyle 属性,最后绘制图形

 

createPattern(image, repeat):建立模式对象,表示如何重复图像。参数:img对象/video对象/另外一个canvas对象(HTML的元素),图像重复模式(和css 的 background-repeat 属性同样,"repeat","repeat-x","repeat-y","no-repeat");

获得模式对象后,将它赋给 fillStyle 属性,而后开始绘制区域

 

getImageData(x, y, w, h):返回一个ImageData对象的实例,参数:要取得数据画面区域的坐标和宽高。ImageData对象有三个属性:width,height,data。data是一个数组,保存着所选的区域的每一个像素的数据(rgba,连续四个),data中每一个像素的数据时依次排列的,数值大小介于0-255之间

globalAlpha:设置全部绘制图像的透明度,值[0,1],默认是0

globalCompositionOperation:表示后绘制的图形怎么样与先绘制的图形结合,可能的值:

"source-over":默认值,后绘制的图形位于先绘制的图形的上方

"source-in":后绘制的图形与先绘制的图形重叠的部分可见,二者其余部分彻底透明

"source-out":后绘制的图形与先绘制的图形不重叠的部分可见,先绘制的图形彻底透明

"source-atop":后绘制的图形与先绘制的图形重叠部分可见,新绘制的图形不受影响

"destination-over":后绘制的图形位于先绘制的图形的下方,只有以前透明像素下的部分可见

"destination-in":后绘制的图形位于先绘制的图形下方,二者不重叠部分彻底透明

"destination-out":后绘制的图形擦除与先绘制的图形的重叠部分

"destination-atop":后绘制的图形位于先绘制图形的下方,在二者不重叠的地方,先绘制的图形变透明

"ligher":后绘制的图形与先绘制的图形重叠部分的值相加,使该部分变亮

"copy":后绘制的图形彻底替代与之重叠的先绘制的图形

"xor":后绘制的图形与先绘制的图形的重叠部分执行”异或“操做

 

 <img src="img/next.png" alt="ss">
    <canvas id="canvas" width="500" height="400">画布,你的浏览器不支持canvas,请更新浏览器</canvas>
    <div id="imgDiv"></div>


    let canvas = document.querySelector("#canvas");
    let imgDiv = document.querySelector("#imgDiv");


    let ctx = canvas.getContext("2d");

    ctx.fillStyle="red";
    ctx.strokeStyle="blue";
   // ctx.strokeRect(10,10,50,50);
    ctx.fillRect(10,10,50,50);
    ctx.clearRect(25,25,10,10);



    let imgURL = canvas.toDataURL("image/png")
    let img = document.createElement("img");
    img.src = imgURL;
    imgDiv.appendChild(img);

    ctx.beginPath();
    ctx.arc( 150, 150, 40, 0, 0.5*Math.PI, false);
    ctx.closePath();
    ctx.stroke();

    ctx.font = "bold 20px Arial";
    ctx.textAlign = "center";
    ctx.textBaseline = "middle";
    ctx.fillText("hello",100,100,50);
    ctx.strokeText("hello",140,140,50);


    var gradient = ctx.createLinearGradient(150,20,150,90);
    gradient.addColorStop(0,"#FFFF00");
    gradient.addColorStop(1,"#000000");

    ctx.fillStyle = gradient;
    ctx.fillRect(130,20,40,70);

    gradient = ctx.createRadialGradient(230,60,15,230,60,35);

    gradient.addColorStop(0,"#FFFF00");
    gradient.addColorStop(1,"#000000");

    ctx.fillStyle = gradient;
    ctx.fillRect(180,10,100,100);

    var pattern = ctx.createPattern(document.images[0],"repeat");
    ctx.fillStyle = pattern;
    ctx.fillRect(290,10,160,155);

   drawImg();
    function drawImg() {  // 简单的灰阶过滤
        let ctx = canvas.getContext("2d");
        let img = document.images[0];
        let imgData,data;

        ctx.drawImage(img,0,0);

        imgData = ctx.getImageData(0,0,img.width,img.height);
        data = imgData.data;

        for(let i=0,len = data.length; i<len; i+=4){
            let red = data[i];
            let green = data[i+1];
            let blue =  data[i+2];
            let alpha = data[i+3];

            let average = Math.floor((red + green + blue)/3);

            data[i] = average;
            data[i+1] = average;
            data[i+2] = average;
        }

        imgData.data = data;
        ctx.putImageData(imgData,0,0);
    }
相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息