zoukankan      html  css  js  c++  java
  • Canvas如何绘制精美的图?

    一.Canvas的基本使用

     首先在使用Canvas一般先在<body>中添加:

    1  <canvas id="Canvas" width="200" height="200"></canvas>

    然后使用Js进行获取canvas和创建画笔:

     <script>
           var Canvas = document.getElementById("Canvas");
           var pen = Canvas.getContext("2d");
      </script>

     继续将创建的画笔绘制一个圆:

      <script>
           var Canvas = document.getElementById("Canvas");
           var pen = Canvas.getContext("2d");
           pen.fillStyle = "#3648DA";
           pen.beginPath()
           pen.arc(100,100,10,0,2*Math.PI);
           pen.stroke()  
      </script>

    二.JS&Canvas的相关属性

    1.颜色、样式和阴影

      

    fillStyle  ------  设置或返回用于填充绘画的颜色、渐变或模式。
    fillRect()
     <script>
           var Canvas = document.getElementById("Canvas");
           var pen = Canvas.getContext("2d");
           pen.fillStyle = "#3648DA";     //设置填充颜色
           pen.fillRect(20,20,150,100);
      </script>

    strokeStyle  ------------  设置或返回用于笔触的颜色、渐变或模式。
    strokeRect()
      <script>
           var Canvas = document.getElementById("Canvas");
           var pen = Canvas.getContext("2d");
           pen.strokeStyle = "blue";
           pen.fillRect(20,20,150,100);
      </script>

    shadowColor  ---------  设置或返回用于阴影的颜色。
    shadowBlur --------- 设置或返回用于阴影的模糊级别。
    <script>
           var Canvas = document.getElementById("Canvas");
           var pen = Canvas.getContext("2d");
           pen.shadowBlur = 44;             //模糊度
           pen.shadowColor = "black";       //阴影颜色
           pen.fillStyle="blue";
           pen.fillRect(20,20,150,100);
      </script>

    shadowOffsetX  --------  设置或返回阴影与形状的水平距离。
    shadowOffsetY  --------  设置或返回阴影与形状的垂直距离。
     <script>
           var Canvas = document.getElementById("Canvas");
           var pen = Canvas.getContext("2d");
           pen.shadowBlur = 44;
           pen.shadowColor = "black";
           pen.shadowOffsetX=30;
           pen.shadowOffsetY=20;
           pen.fillStyle="blue";
           pen.fillRect(20,20,150,100);
      </script>

    createLinearGradient() --------- 创建线性渐变(用在画布内容上)。
      <script>
           var c=document.getElementById("Canvas");  //获取画布
           var ctx=c.getContext("2d");              //创建2d画笔
           
           var grd=ctx.createLinearGradient(0,0,170,0);  //创建线性渐变
           grd.addColorStop(0,"black");                  //起始位置
           grd.addColorStop(1,"white");                  //结束位置
           
           ctx.fillStyle=grd;
           ctx.fillRect(20,20,150,100);
      </script>

    createPattern(object,model) ------- 在指定的方向上重复指定的元素。
      <script>
           var c=document.getElementById("Canvas");  //获取画布
           var ctx=c.getContext("2d");              //创建2d画笔
           ctx.clearRect(0,0,200,200);   //清除
           var earth = document.getElementById("earth"); //获取
           var pat=ctx.createPattern(earth,"repeat");   //创建模式
               ctx.rect(0,0,220,128);                 //
               ctx.fillStyle=pat;    //填充
               ctx.fill();
          
      </script>
    createRadialGradient ------ 创建放射状/环形的渐变(用在画布内容上)。
    addColorStop() --------  在指定的方向上重复指定的元素。
     1   <script>
     2     var canvas = document.getElementById("Canvas");
     3     var ctx = canvas.getContext("2d");
     4     
     5      var grd = ctx.createLinearGradient(75,50,5,90,60,100);
     6      grd.addColorStop(0,"red");
     7      grd.addColorStop(1,"white");
     8      ctx.fillStyle = grd;
     9      ctx.fillRect(10,10,150,100);
    10   </script>

    2.线条样式

    lineCap  -------- 设置或返回线条的结束端点样式。
       lineWidth  --------  设置或返回当前的线条宽度。
    var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
        
         var grd = ctx.createLinearGradient(75,50,5,90,60,100);
         ctx.beginPath();
    ctx.lineWidth=10; ctx.lineCap
    ="round"; //线的结束线帽 ctx.moveTo(20,20); ctx.lineTo(20,200); ctx.stroke();

    lineJoin   ---------    设置或返回两条线相交时,所创建的拐角类型。
      <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
    
         ctx.beginPath();
         ctx.lineWidth =10;
         ctx.lineJoin="round";
         ctx.moveTo(20,20);
         ctx.lineTo(100,50);
         ctx.lineTo(20,100);
         ctx.stroke();
      </script>

    miterLimit  ---------设置或返回最大斜接长度
      <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
    
        ctx.lineWidth=10;
        ctx.lineJoin="miter";
        ctx.miterLimit=5;
        ctx.moveTo(20,20);
        ctx.lineTo(50,27);
        ctx.lineTo(20,34);
        ctx.stroke();
      </script>

     

      

    3.矩形

    rect(x,y,width,height)  -------  创建矩形
    <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
    
        ctx.rect(20,20,150,100);
        ctx.stroke();
      </script>

    fillRect(x,y,w,h) ------- 绘制"被填充"的矩形。
     <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
        ctx.fillRect(0,0,100,100);
        
      </script>

    strokeRect(x,y,w,h)  --------- 绘制矩形(无填充)。
      <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
        ctx.strokeRect(0,0,100,100)
        
      </script>

    clearRect()  -------  在给定的矩形内清除指定的像素。 
     <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
        ctx.fillStyle="red";
        ctx.fillRect(0,0,300,150);
        ctx.clearRect(20,20,100,50);
      </script>

    4.路径

     

    fill ------- 填充当前绘图(路径)。
     <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
        ctx.rect(20,20,150,100);
        ctx.fillStyle="red";
        ctx.fill();     //当前路径填充
      </script>

    stroke()   --------  绘制已定义的路径。
      <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
       ctx.beginPath();
       ctx.moveTo(20,20);
       ctx.lineTo(20,100);
       ctx.lineTo(70,100);
       ctx.strokeStyle="red"; 
       ctx.stroke();  
      </script>

    beginPath()   ---------  起始一条路径,或重置当前路径。
      <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
    ctx.beginPath();
    ctx.lineWidth="5";
    ctx.strokeStyle="green"; // Green path
    ctx.moveTo(0,75);
    ctx.lineTo(250,75);
    ctx.stroke(); // Draw it
    
    ctx.beginPath();
    ctx.strokeStyle="purple"; // Purple path
    ctx.moveTo(50,0);
    ctx.lineTo(150,130);
    ctx.stroke(); // Draw it
      </script>

    moveTo()   -------------- 把路径移动到画布中的指定点,不创建线条。
    lineTo() -------------- 添加一个新点,然后在画布中创建从该点到最后指定点的线条。
      <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
    ctx.beginPath();
    ctx.moveTo(0,0);
    ctx.lineTo(300,150);
    ctx.stroke();
      </script>

    clothPath()    ---------     创建从当前点回到起始点的路径
      <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
        ctx.beginPath();
        ctx.moveTo(20,20);
        ctx.lineTo(20,100);
        ctx.lineTo(70,100);
        ctx.closePath();
        ctx.stroke();
      </script>
    clip() -----  从原始画布剪切任意形状和尺寸的区域。
      <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
        // Clip a rectangular area
        ctx.rect(50,20,200,120);      //
        ctx.stroke();
        ctx.clip();                  //用上面的框截取下面
        // Draw red rectangle after clip()
        ctx.fillStyle="red";
        ctx.fillRect(0,0,150,100);
      </script>

    quadraticCurveTo()   ----------   创建二次贝塞尔曲线。
      <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
        
       ctx.beginPath();
       ctx.moveTo(20,20);
       ctx.quadraticCurveTo(20,100,200,20);
       ctx.stroke();
      </script>

    bezierCurveTo()     ----------   创建三次贝塞尔曲线。
     <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
        
          ctx.beginPath();
          ctx.moveTo(20,20);
          ctx.bezierCurveTo(20,100,200,100,200,20);    //贝塞尔
          ctx.stroke();
      </script>

    arc()    ---------    创建弧/曲线(用于创建圆形或部分圆)。
     <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
        
        ctx.beginPath();
        ctx.arc(100,75,50,0,2*Math.PI);
        ctx.stroke();
      </script>

    arcTo()    --------    创建两切线之间的弧/曲线。
    <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
        
        ctx.beginPath(); 
        ctx.moveTo(20,20);           // 创建起始点
        ctx.lineTo(100,20);          // 创建水平线 
        ctx.arcTo(150,20,150,70,50); // 创建弧
        ctx.lineTo(150,120);         // 创建垂直线
        ctx.stroke();                // 画出来
      </script>

     

    isPointlnPath()  --------  如果指定的点位于当前路径中,则返回 true,否则返回 false。
     <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
        ctx.rect(20,20,150,100);
        if (ctx.isPointInPath(20,50))  //如果路径经过(20,50)为True
           {
           ctx.stroke();     //绘制
           };
      </script>

    5.转换

    scale(x,y)       --------     缩放当前绘图至更大或更小。   1--100%    0.5---50%
    <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
        ctx.strokeRect(5,5,25,15);
        ctx.scale(2,2);
        ctx.strokeRect(5,5,25,15);
      </script>

    rotate()   --------  旋转当前绘图。
      <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
        ctx.rotate(20*Math.PI/180);
        ctx.fillRect(50,20,100,50);
      </script>

    translate(x,y)     --------  替换绘图的当前转换矩阵。
     <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
        ctx.fillRect(10,10,100,50);
        ctx.translate(70,70);
        ctx.fillRect(10,10,100,50);
      </script>

    setTransform   ------  将当前转换重置为单位矩阵。然后运行 transform()。
      <script>
        var canvas = document.getElementById("Canvas");
        var ctx = canvas.getContext("2d");
        ctx.fillStyle="yellow";
        ctx.fillRect(0,0,250,100)
        
        ctx.setTransform(1,0.5,-0.5,1,30,10);
        ctx.fillStyle="red";
        ctx.fillRect(0,0,250,100);
        
        ctx.setTransform(1,0.5,-0.5,1,30,10);
        ctx.fillStyle="blue";
        ctx.fillRect(0,0,250,100);
      </script>

    6.文本

    7.图像绘制

    8.像素操作

    9.合成

    10.其他

    三.精美的Canvas案例

      <script>var canvas = document.getElementById("Canvas");var ctx = canvas.getContext("2d");// Clip a rectangular areactx.rect(50,20,200,120);ctx.stroke();ctx.clip();// Draw red rectangle after clip()ctx.fillStyle="red";ctx.fillRect(0,0,150,100);  </script>

    M54
  • 相关阅读:
    Codeforces Round #372 (Div. 1) B. Complete The Graph (枚举+最短路)
    HDU6430 Problem E. TeaTree【dsu on tree】
    HDU4358 Boring counting【dsu on tree】
    HDU6191 Query on A Tre【dsu on tree + 01字典树】
    2019 ICPC Asia Yinchuan Regional
    广义后缀自动机 例题
    2017-2018 ACM-ICPC Northern Eurasia (Northeastern European Regional) Contest (NEERC 17)
    BZOJ3238 [Ahoi2013]差异 【SAM or SA】
    HDU4622 Reincarnation【SAM】
    BZOJ1396 识别子串【SAM+SegmentTree】
  • 原文地址:https://www.cnblogs.com/Crown-V/p/12268266.html
Copyright © 2011-2022 走看看