zoukankan      html  css  js  c++  java
  • canvas

    canvas元素是h5的一部分,使用js在网页上绘制图像,canvas拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法

    <!-- 画布白色,并且默认大小300 * 150,不建议在 CSS 中设置大小 -->
    <canvas width="500" height="500"></canvas>
    <script>
        var myCanvas = document.querySelector('canvas'),
            ctx = myCanvas.getContext('2d');   // 获取上下文,绘制工具箱
    
        // 使用工具进行绘画,一条直线
        ctx.moveTo(100,100.5);    // 画笔默认在 (0,0) 位置,将其移动到目标位置
        ctx.lineTo(200,100.5);    // 绘制直线,仅仅是轨迹(绘制路径),所以看不到
        ctx.stroke();             // 描边
    </script>
    

    在css设置canvas大小会拉伸画布从而令图画也被拉伸
    线条默认的宽度是1px,默认的颜色是黑色,之所以会变成2px和灰色,线条在刻度中间绘制,也就是上个像素点的一半和下个像素点的一半,因为是占一半没有饱和所以显示灰色,又因为无法显示0.5px,所以变成2px
    只要往上或往下移动0.5即可解决上面问题,线宽是偶数的话则不需要偏移0.5

    设置直线颜色和宽度

    <canvas width="500" height="500"></canvas>
    <script>
        var myCanvas = document.querySelector('canvas'),
            ctx = myCanvas.getContext('2d'); 
    
        // 使用工具进行绘画,一条直线
        ctx.moveTo(100,100.5); 
        ctx.lineTo(200,100.5); 
        ctx.stroke();
    
        // 设置颜色和直线宽度
        ctx.beginPath();          // 开启新路径,解决样式覆盖问题
        ctx.moveTo(100,200.5);
        ctx.lineTo(200,200.5);
        ctx.strokeStyle = '#c21500';
        ctx.lineWidth = 3;
        ctx.stroke();
    </script>
    

    绘制三角形

    <canvas width="500" height="500"></canvas>
    <script>
        var myCanvas = document.querySelector('canvas'),
            ctx = myCanvas.getContext('2d');   // 获取上下文,绘制工具箱
    
        ctx.moveTo(100,300.5);
        ctx.lineTo(200,300.5);
        ctx.lineTo(100,400);
        // ctx.lineTo(100,300.5);
        ctx.closePath();  // 自动闭合,会根据起始点来自动闭合
        ctx.lineWidth = 10;
        ctx.stroke();
        // ctx.fill();  填充,画轨迹后可选择怎么处理轨迹,是描边还是填充
    </script>
    

    镂空正方形

        ctx.beginPath();
        ctx.moveTo(100, 500);
        ctx.lineTo(200, 500);
        ctx.lineTo(200, 600);
        ctx.lineTo(100, 600);
        ctx.closePath();
        ctx.fillStyle = '#09c';
        ctx.fill();
    
        ctx.beginPath();
        ctx.moveTo(150, 520);
        ctx.lineTo(180, 580);
        ctx.lineTo(120, 580);
        ctx.closePath();
        ctx.fillStyle = '#fff';
        ctx.fill();
    

    虚线

        // setLineDash(),参数必须放一个数组,数组元素1表宽度,元素2表间距
        // 数组元素为偶数时,才会重复地显示,否则会出现颜色不一致的情况
        // lineDashOffset 为虚线开始绘制时的偏移距离,正向左偏,负向右偏
        ctx.beginPath();
        ctx.moveTo(100, 600);
        ctx.lineTo(200,600);
        ctx.lineWidth = 10;
        ctx.strokeStyle = 'purple';
        ctx.setLineDash([4,2]);
        ctx.lineDashOffset = 2;
        ctx.stroke();
    

    渐变色

        ctx.lineWidth = 30;
        for(var i = 0; i < 255; i++){
            ctx.moveTo(300 + i,100);
            ctx.lineTo(400 + i,100);  // 横坐标要比300大,甚至301就可以了,反正后面的画会覆盖前面
            ctx.strokeStyle = 'rgba('+i+','+ i +','+ i +')';
            ctx.stroke();
            ctx.beginPath();
        }
    

    矩形,有专门的 api 用来绘制矩形

    // rect(x,y,w,h) 没有独立路径,之后若不 beginPath() 则会影响后面图形的绘制
    ctx.rect(300, 180, 60, 40);
    ctx.strokeStyle = '#FF5722';
    ctx.stroke();
    
    ctx.strokeRect(400, 180, 60, 40);  // 描边矩形,有独立路径,不会影响其他,自己也不会被影响
    
    ctx.fillStyle = '#FFB800';
    ctx.fillRect(500, 180, 60, 40);     // 填充矩形,有独立路径
    // ctx.clearRect(x,y,w,h)  擦除矩形区域,该区域下的所有图案都会被擦除
    

    弧度
    ** 弧度是角的度量单位,弧长等于半径的弧,所对圆心角为1弧度,一个圆有 2πr/r = 2π 个弧度,一个圆360度,所以一弧度为 180/π **

    // arc(x,y,r,起始弧度,结束弧度,绘制方向顺时针false逆时针true),默认 false
    ctx.strokeStyle = '#5FB878';
    ctx.arc(340,340,50,0,Math.PI * 2);
    ctx.stroke();
    

    扇形
    要先设置起始点(画笔移动到圆心,否则无法自动闭合)

    ctx.arc(340, 500, 50, Math.PI, Math.PI * 3 / 2);
    ctx.closePath();
    ctx.stroke();
    

    文本
    strokeText() 和 fillText() 都有4个参数(text,x,y,[maxWidth]),maxWidth 为文本所占位置的最大宽度

    ctx.font = '26px poppin';
    ctx.strokeText('描边文本',340,560.5);
    ctx.fillText('填充文本',340,600.5);
    

    样式设置
    设置样式,画笔的状态
    ● lineWidth 线宽,默认1px
    ● lineCap 线末端类型:(butt默认)、round、square
    ● lineJoin 相交线的拐点 miter(默认)、round、bevel
    ● strokeStyle 线的颜色
    ● fillStyle 填充颜色
    ● setLineDash() 设置虚线
    ctx.setLineDash([10,5,8]); //数组用来描述排列方式
    ● getLineDash() 获取虚线宽度集合
    ● lineDashOffset 设置虚线偏移量(负值向右偏移)

    文本样式
    ctx.textAlign 文本水平对齐方式,相对绘制坐标left、center、right、start(默认)、end
    ctx.direction 属性css(rtl ltr) start和end于此相关,如果是ltr,start和left表现一致,如果是rtl,start和right表现一致
    ctx.textBaseline 设置基线(垂直对齐方式 )
    top,文本的基线处于文本的正上方,并且有一段距离
    middle,文本的基线处于文本的正中间
    bottom,文本的基线处于文本的证下方,并且有一段距离
    hanging,文本的基线处于文本的正上方,并且和文本粘合,作为印度文基线
    alphabetic,默认值,基线处于文本的下方,并且穿过文字,英文基线
    ideographic,中文基线,和bottom相似,但是不一样
    measureText() 获取文本宽度obj.width

    新建 ctx2 = myCanvas.getContent('2d'); 后线条颜色宽度等设置依旧没重置

    绘制网格

    绘制坐标系

    绘制点

    绘制图片
    加载图片到内存的两种方式
    var img = document.createElement('img');
    img.src = 'psb.jpg';
    或者
    var image = new Image(); // 和上面没区别
    image.src = 'psb.jpg';

    <canvas width="600" height="600"></canvas>
    <script>
        var ctx = document.querySelector('canvas').getContext('2d');
    
        // 1.创建对象
        var image = new Image();
    
        // 2.绑定加载完成事件,必须要等到图片加载完毕,因为是通过路径引入,所以可能图片的加载快过事件的绑定
        image.onload = function () {
            ctx.drawImage(image, 100, 100, 100, 100, 300, 200, 50, 50);
        };
    
        // 3.设置图片路径
        image.src = 'psd.jpeg';
    
        /**
         * canvas 的 drawImage() 方法
         * drawImage(img,x,y)  img 可以是图片、canvas对象或 video 对象,xy为画布上的坐标,这样放置的 img 会是原始尺寸
         * drawImage(img,x,y,w,h)  wh 为绘制的尺寸,是设置宽高,不是截取
         * drawImage(img,x,y,w,h,x1,y1,w1,h1)
         * x,y,w,h 是原图上的一个矩形区域
         * x1,y1,w1,h1 是画布上的一个矩形区域
         * 将原图上选定的矩形区域图像显示到画布指定的矩形区域
         * 若 w1h1 大于 wh ,则这区域的图像会被等比放大,同理,相等则是原尺寸,小于则是等比缩小
         * */
    </script>
    
  • 相关阅读:
    2017加油
    配置SSH框架的心得
    .net 中select和where的区别
    oracle查询中文数据出现乱码
    three.js 加载 obj模型
    下载别人的3D模型文件
    关闭按钮
    桌面截屏保存成gif形式(软件)
    vue 中引入 three.js
    three.js-地球贴图-TextureLoader
  • 原文地址:https://www.cnblogs.com/Grani/p/11974827.html
Copyright © 2011-2022 走看看