canvas

Posted zshno1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了canvas相关的知识,希望对你有一定的参考价值。

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只有新图像会保留,其余的全部被清除
             * */

        }

 

以上是关于canvas的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 Canvas 支持和 Android Webview

微信小程序海报 uniapp

微信小程序海报 uniapp

iPad 对 Canvas 标签的限制;画布标签动画上的网页崩溃

简单的圆形下载进度条

如何删除画布周围的灰色边框