zoukankan      html  css  js  c++  java
  • HTML5--新增元素canvas一(8.3)

    前言:

      这节课介绍canvas中其他的API

      1.绘制图片API(drawImage)

        作用:通过drawImage(img, x, y)方法在画布上绘制图像、画布或视频,也能够绘制图像的某些部分,以及/或者增加或减少图像的尺寸。

        方法

          drawImage(img, x, y):在画布上绘制图像/视频

          drawImage(img, x, y,width, height):在画布上绘制指定宽、高的图像/视频

          drawImage(img, sx, sy,swidth, sheight,x, y, width, height):剪切图像,并在画布上定位剪切的图像。

        参数

          img:要绘制的图像/视频

          x:绘制的x坐标位置

          y:绘制的y坐标位置

          绘制图像的宽

          height:绘制图像的高

          sx:开始剪切的x坐标位置

          sy:开始剪切的y坐标位置

          s剪切的图像的宽

          sheight:剪切的图像的高

        drawImage(img, x, y)示例

    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            canvas {
                border:1px solid black;
            }
        </style>
    </head>
    <body>
        <canvas width="600" height="400" id="cas"></canvas>
    </body>
    <script>
        var cas = document.getElementById( 'cas' );
        var ctx = cas.getContext( '2d' );
        var img = new Image();
        img.src = './imgs/rBACFFH1-B7DFB4PAAAYpkS1Sv4882_200x200_3.jpg';
    
        var x = 100, 
            y = 100;
        // 1, 开始绘制( 需要等待, 等到图片加载完毕后再执行 )
        // ctx.drawImage( img, x, y );
        img.onload = function () {
            ctx.drawImage( img, x, y );
        };
    </script>

      drawImage(img, x, y,width, height)示例

    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            canvas {
                border:1px solid black;
            }
        </style>
    </head>
    <body>
        <canvas width="600" height="400" id="cas"></canvas>
    </body>
    <script>
        var cas = document.getElementById( 'cas' );
        var ctx = cas.getContext( '2d' );
        var img = new Image();
        img.src = './imgs/3484432_092618805000_2.jpg';
        // 2, 准备矩形区域
        var x = 100, 
            y = 100,
            width,
            height = 200;
        // 3, 开始绘图
        img.onload = function () {
             width = img.width * height / img.height;
            ctx.drawImage( img, x, y, width, height );
        };
    </script>

      drawImage(img, sx, sy,swidth, sheight,x, y, width, height)示例:

    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            canvas {
                border:1px solid black;
            }
        </style>
    </head>
    <body>
        <canvas width="600" height="400" id="cas"></canvas>
    </body>
    <script>
        var cas = document.getElementById( 'cas' );
        var ctx = cas.getContext( '2d' );
        // 1, 准备 image 对象
        var img = new Image();
        img.src = './imgs/3484432_092618805000_2.jpg';
        // 2, 准备矩形区域
        var x = 100, 
            y = 100,
            width = 300,
            height = 200,
            sx = 677,
            sy = 0;
        // 3, 开始绘图
        img.onload = function () {
            ctx.drawImage( img, sx, sy, width, height, x, y, width / 2, height * 2 );
        };
    </script>

      2.API(translate)移动

        作用:通过translate(x, y)方法可以对绘图的坐标x,y进行移动

        示例

    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            canvas {
                border:1px solid black;
            }
        </style>
    </head>
    <body>
        <canvas width="600" height="400" id="cas"></canvas>
    </body>
    <script>
        var cas = document.getElementById( 'cas' );
        var ctx = cas.getContext( '2d' );
        // 1. 绘制一个圆, 在画布的左半边
        var x1 = cas.width / 4;
        var y1 = cas.height / 2;
        var radius1 = 100;
        // 将坐标轴向右平移 半个画布
        ctx.translate( cas.width / 2, 0 ); 
        ctx.strokeStyle = 'red';
        ctx.arc( x1, y1, radius1, 0, 2 * Math.PI );
        ctx.stroke();
    </script>

      3.API(scale)缩放,绘制椭圆

        作用:通过scale(x, y)方法可以对绘图x,y轴方向进行倍数的比例缩放

        椭圆示例

    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            canvas {
                border:1px solid black;
            }
        </style>
    </head>
    <body>
        <canvas width="600" height="400" id="cas"></canvas>
    </body>
    <script>
        var cas = document.getElementById( 'cas' );
        var ctx = cas.getContext( '2d' );
        // 1. 绘制一个圆, 在画布的左半边
        var x1 = cas.width / 4;
        var y1 = cas.height / 2;
        var radius1 = 100;
        ctx.strokeStyle = 'red';
        // 将 x 轴的长度缩小一半, y 轴不变
        ctx.scale( 0.5, 1 );
        ctx.arc( x1, y1, radius1, 0, 2 * Math.PI );
        ctx.stroke();
    </script>

      4.API(rotate)旋转

        作用:rotate() 方法通过指定一个角度(弧度),改变了画布坐标和 Web 浏览器中的 <Canvas> 元素的像素之间的映射关系

        示例

    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            canvas {
                border:1px solid black;
            }
        </style>
    </head>
    <body>
        <canvas width="600" height="400" id="cas"></canvas>
    </body>
    <script>
        // 处理弧度与角度的计算
        function toAngle ( radian ) {
            return radian * 180 / Math.PI; 
        }
        function toRadian ( angle ) {
            return angle * Math.PI / 180;
        }
        var cas = document.getElementById( 'cas' );
        var ctx = cas.getContext( '2d' );
        // 将坐标轴移动到画布的中间
        ctx.translate( cas.width / 2, cas.height / 2 );
        // 通过旋转坐标实现图形的旋转
        ctx.rotate( toRadian( 15 ) );
        // 绘制矩形
        var width = 100;
        ctx.strokeRect( 0 - width / 2, 0 - width / 2, width, width );
    </script>

      5.状态保存/恢复save()/restore()

        作用:用来保存和恢复画笔的状态,从而避免画笔属性对之后绘画的影响

        示例

    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            canvas {
                border:1px solid black;
            }
        </style>
    </head>
    <body>
        <canvas width="600" height="400" id="cas"></canvas>
    </body>
    <script>
        var cas = document.getElementById( 'cas' );
        var ctx = cas.getContext( '2d' );
        
        // rect的手动封装
        function Rect ( config ) {
            this.ctx = config.ctx;
            this.x = config.x;
            this.y = config.y;
            this.width = config.width;
            this.height = config.height;
            this.lineWidth = config.lineWidth;
            this.strokeStyle = config.strokeStyle;
            this.fillStyle = config.fillStyle;
        }
        Rect.prototype = {
            constructor: Rect,
            stroke: function () {
                var ctx = this.ctx;
                // 保存还未设置属性的ctx对象
                ctx.save();
                ctx.lineWidth = this.lineWidth;
                if ( this.strokeStyle ) { 
                    ctx.strokeStyle = this.strokeStyle;
                }
                ctx.strokeRect( this.x, this.y, this.width, this.height );
                // 恢复之前保存的ctx对象
                ctx.restore();
            },
            fill: function () {
                var ctx = this.ctx;
                // 保存还未设置属性的ctx对象
                ctx.save();
                ctx.lineWidth = this.lineWidth;
                if ( this.fillStyle ) { 
                    ctx.fillStyle = this.fillStyle;
                }
                ctx.fillRect( this.x, this.y, this.width, this.height );
                // 恢复之前保存的ctx对象
                ctx.restore();
            }
        }
        var rect1 = new Rect({
            ctx: ctx,
            x: 10,
            y: 10,
             100,
            height: 50,
            strokeStyle: 'red',
            fillStyle:'green',
            lineWidth: 10
        });
        rect1.fill();
    
        var rect2 = new Rect({
            ctx: ctx,
            x: 200,
            y: 200,
             200,
            height: 100
        });
        rect2.fill();
    </script>

      6.绘制贝塞尔曲线bezierCurveTo() 

        作用:bezierCurveTo() 方法通过使用表示三次贝塞尔曲线的指定控制点,向当前路径添加一个点。

        方法:bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)

          cp1x/cp1y:第一个控制点的坐标

          cp2x/cp2y:第二个控制点的坐标

          x/y:结束点的坐标

        注意:前两个点是用于三次贝塞尔计算中的控制点,第三个点是曲线的结束点。曲线的开始点是当前路径中最后一个点。如果路径不存在,使用 beginPath() 和 moveTo() 方法来定义开始点。

        示例

    <body>
    <canvas id="myCanvas" width="300" height="150">
    Your browser does not support the HTML5 canvas tag.</canvas>
    
    <script>
        var c=document.getElementById("myCanvas");
        var ctx=c.getContext("2d");
        ctx.beginPath();
        ctx.moveTo(20,20);
        ctx.bezierCurveTo(20,100,200,100,200,20);
        ctx.stroke();
    </script> 
    
    </body>

      7.绘制渐变颜色图形

        作用:createLinearGradient() 方法创建线性的渐变对象,作为fillStyle或strokeStyle的属性值,从而完成线性渐变图形的绘制。

        方法

          createLinearGradient(x0, y0, x1, y1) 

            x0/y0:渐变开始点的坐标位置。

            x1/y1:渐变结束点的坐标位置。

          addColorStop(stop, color)

            stop:介于 0.0 与 1.0 之间的值,表示渐变中开始与结束之间的位置。

            color:在结束位置显示的 CSS 颜色值

    <body>
        <canvas id="myCanvas" width="300" height="150">
        Your browser does not support the HTML5 canvas tag.
        </canvas>
    <script>
        var c=document.getElementById("myCanvas");
        var ctx=c.getContext("2d");
        //创建线性渐变对象
        ar grd=ctx.createLinearGradient(0,0,170,0);
        //设置渐变色
        grd.addColorStop(0,"black");
        grd.addColorStop(1,"white");
        //线性渐变对象作为fillStyle的属性值
        ctx.fillStyle=grd;
        ctx.fillRect(20,20,150,100);
    </script>
    </body>

      

  • 相关阅读:
    GDC2017:Framegraph-extensible-rendering-architecture-in-frostbite
    17072802(UE4的批量Import)
    16011301(统计指令数影响耗时)
    16080401(面向摄像机的Instance模型)
    UE4编译_201701
    17020701(AnimDynamic继续)
    Python过滤utf8mb4无效字符
    Windows下安装MySQL-python
    使用Pycharm更新Github项目(到源项目)
    python异常:error: command 'gcc' failed: No such file or directory
  • 原文地址:https://www.cnblogs.com/diweikang/p/8732920.html
Copyright © 2011-2022 走看看