var canvas = document.getElementById('c1'); /* * getContext获取canvas的上下文环境; * 参数:2d (暂时还不支持3d); * getContext('2d');对象是内建的html5对象,拥有多种回执路径、矩形、圆形、字符以及添加图像的方法 */ var ctx = canvas.getContext('2d'); /* * 绘制矩形 * fillRect(x,y,width,height) 绘制一个填充的矩形 * strockRect(x,y,width,height) 绘制一个矩形的边框 * clearRect(x,y,width,height) 清除指定的矩形区域,然后这块区域会变的完全透明 */ ctx.fillStyle = "rgba(200,0,0,1)"; ctx.fillRect(10, 10, 50, 50); ctx.strokeRect(250, 350, 100, 100); ctx.strokeStyle = "rgba(0,0,0)"; ctx.clearRect(10, 10, 20, 20); /* * 绘制路径 * 1、创建路径起始点 * 2、调用绘制方法去绘制出路径 * 3、把路径封闭 * 4、一旦路径生成,通过描边或填充路径区域来渲染图形 * beginPath()新建一条路径,路径一旦创建成功,图形绘制命令被指向到路径上生成路径 * moveTo(x,y)把画笔 移动到指定的坐标(x,y)。相当于设置路径的起始点坐标。 * lineTo(x,y);绘制一条从当前位置(moveTo(x,y))到指定坐标(x, y)的直线 * closePath()闭合路径之后,图形绘制命令又重新指向上下文中 * stroke()通过线条来绘制图形轮廓 * fill()通过填充路径的内容区域生成实心的圆 */ ctx.beginPath(); ctx.moveTo(75, 50); ctx.lineTo(100, 75); ctx.lineTo(100, 25); ctx.closePath() ctx.stroke(); /* *绘制圆弧 * arc(x,y,r,startAngle,endAngle,anticlosewise) * 以(x,y)为圆心,以r为半径,从startAngle弧度开始到endAngle弧度结束。 * anticlosewise是布尔值,ture表示逆时针,flase表示顺时针。(默认顺时针) */ ctx.beginPath(); ctx.arc(300, 350, 50, Math.PI, Math.PI * 2, false) ctx.closePath() ctx.stroke() /* *arcTo(x1,y1,x2,y2,radius) * 根据给定的控制点和半径画一段圆弧,最后再以直线连接两个控制点 * 第一条切线 起始点和控制点1决定的直线 * 第二条切线 控制点1和控制点2决定的直线 * 其实绘制的圆弧就是与这两条直线相切的圆弧 */ ctx.beginPath(); ctx.moveTo(200, 200); ctx.arcTo(300, 200, 300, 300, 100); ctx.lineTo(300, 300); ctx.stroke() /** *贝塞尔曲线 * 绘制二次贝塞尔曲线 * quadraticCurveTo(cp1x,cpl1y,x,y) * 参数1和2:控制点坐标 * 参数3和4:结束点坐标 * 绘制三次贝塞尔曲线 * bezierCurveTo(cp1x,cp1y,cp2x,xp2y,x,y) * 参数1和2:控制点1的坐标 * 参数3和4:控制点2的坐标 * 参数5和6:结束点的坐标 */ /* * fileStyle = color * 设置图形的填充颜色 * srtokeStyle = color * 设置图形轮廓的颜色 * 1. `color` 可以是表示 `css` 颜色值的字符串、渐变对象或者图案对象。 * 2. 默认情况下,线条和填充颜色都是黑色。 * 3. 一旦您设置了 `strokeStyle` 或者 `fillStyle` 的值, * 那么这个新值就会成为新绘制的图形的默认值。如果你要给每个图形上不同的颜色, * 你需要重新设置 `fillStyle` 或 `strokeStyle` 的值。 * * * * */ /* * line style * 1、lineWidth = value * 线宽。只能是正值。默认为1 * 2、lineCap = type * 线条末端样式 * butt:线段末端以方形结束 * round:线段末端以圆形结束 * square:线段末端以方形结束,但是增加了一个宽度和线段相同。 * 高度是线段厚度一半的矩形区域 * 3、lineJoin = type * 同一个path内,设定线条与线条间接合处的样式 * round:通过填充一个额外的,圆心在相连部分末端的扇形, * 绘制拐角的形状。圆角的半径是线段的宽度。 * bevel:在相连部分的末端填充一个额外的以三角形为底的区域, * 每个部分都有各自独立的矩形拐角 * miter(默认)通过延伸相连部分的外边缘,使其相交于一点, * 形成一个额外的菱形区域。 * 4、虚线 * 用setLineDash方法和lineDashOffset属性来制定虚线样式。 * setLineDash方法接受一个数组,来指定线段与间隙来交替; * lineDashOffset属性设置起始偏移量。 * getLineDash() 返回一个包含当前虚线样式,长度为非负偶数的数组 * */ /* * 绘制文本 * fillText(text,x,y[,maxWidth])在指定的(x,y)位置填充指定的文本,绘制的最大宽度是可选的 * strokeText(text,x,y[,maxWidth])在指定的(x,y)位置绘制文本边框,绘制的最大宽度是可选的 * 给文本添加样式 * 1、font = value * 当前我们用来绘制文本的样式。这个字符串使用和css font属性相同的语法。默认的字体是10px sabs-serif * 2、textAlign = value * 文本对齐选项。可选的值包括:start,end,left,right,center默认值是start * 3、textBaseline = value * 基线对齐选项,可选的值包括:top hanging,plphabetic,ideographico,bottom默认值是alphabetic * 4、direction = value * 文本方向。可选的值包括:lte,rtl,inherit。默认值是inherit * */ ctx.font = '50px 楷体' ctx.strokeText('张省会', 100, 100) /* * 绘制图片 * 创建img元素 * var img = new Image(); //创建一<img>元素 img.src = '1.jpg'; //设置图片源路径 * */ /* * 绘制img * drawImage(img,0,0) * ctx.drawImage(img,x,y) * 参数1 要绘制的img * 参数2、3 绘制的img在canvas中的坐标 * 缩放图片 * drawImage(image, x, y, width, height) * 参数4、5控制canvas图片大小 * 切片 * drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) * 第一个参数和其它的是相同的,都是一个图像或者另一个 canvas 的引用。 * 前4个是定义图像源的切片位置和大小, * 后4个则是定义切片的目标显示位置和大小。 * */ /* 注意:考虑到图片是从网络加载,如果 drawImage 的时候图片还没有完全加载完成, * 则什么都不做,个别浏览器会抛异常。所以我们应该保证在 img 绘制完成之后再 drawImage。 * */ var img = new Image(); // 创建img元素 img.onload = function() { ctx.drawImage(img, 0, 200, 400, 200) var dataURL = canvas.toDataURL(); console.log(dataURL) console.log(document.getElementsByClassName('canvasImg')[0]) document.getElementsByClassName('canvasImg')[0].setAttribute('src', dataURL) } img.src = '../corpper/images/mm_case_01.jpg'; // 设置图片源地址 /* * 状态的保存和恢复 * save() 可以调用任意多次save方法(类似数组的push()) * Canvas状态存储在栈中,每当save()方法被调用后,当前的状态就被推送到栈中保存。 * restore() (类似书中的pop()) * 每一次调用restore方法,上一个保存的状态就从栈中弹出,所有设定都恢复。 * * */ /* * 变形 * 1、translate(x,y) 用来移动canvas的原点到指定的位置 * x 是左右偏移量,y是上下偏移量 * 2、rotate() * 旋转坐标轴 一个参数 它是顺时针方向的,以弧度为单位的值 * 3、scale(x,y)缩小放大 * 接受两个参数。x,y分别是横轴和纵轴的缩放因子,它们都必须是正值。 * 值比 1.0 小表示缩 小,比 1.0 大则表示放大,值为 1.0 时什么效果都没有。 * 4、transform(变形矩形) * transform(a,b,c,d,e,f) * */ // ctx.save() ctx.translate(100, 10) // ctx.restore() ctx.rotate(Math.PI / 180 * 20) ctx.scale(0.5, 0.5) /* * 合成 * 我们总是将一个图形画在另一个之上,对于其他更多的情况,仅仅这样是远远不够的。 * 比如,对合成的图形来说,绘制顺序会有限制。 * 不过,我们可以利用 globalCompositeOperation 属性来改变这种状况。 * globalCompositeOperation = type * type有13个值 * 1、source-over (默认设置)新图像会覆盖在原有图像 * 2、source-in 仅仅会出现新图像与原来图像重叠的部分,其他区域都会变成透明的 * 3、source-out 仅仅显示新图像与老图像没有重叠的部分,其余部分全部透明。 * 4、source-atop 新图像 仅仅显示与老图像重叠区域。老图像仍然可以显示。 * 5、desyination-over 新图像会在老图像的下面 * 6、destination-in 仅仅新老图像重叠部分的老图像被显示,其他区域全部透明 * 7、destination-out 仅仅老图像与新图像没有重叠的部分。注意显示的是老图像的部分区域 * 8、destination-atop 老图像仅仅显示重叠部分,新图像会显示在老图像的下面。 * 9、linghter 新老图像都显示,但是重叠区域的颜色做加处理 * 10、darken 保留重叠部分最黑的像素 * 11、linghten 保证重叠部分最量的像素 * 12、xor 重叠部分会变得透明 * 13、copy只有新图像会保留,其余的全部被清除 * */ }