美文网首页
canvas学习二

canvas学习二

作者: dingFY | 来源:发表于2021-04-07 16:55 被阅读0次

一、绘制文字

【1】font字体属性

canvas 里的font 属性和css 的font 属性是一样的,它可以设置文本的粗细、字号、字体等

  • css 设置字体:p{ font: bold 15px 微软雅黑; }
  • canvas 设置字体:ctx.font = 'bold 15px 微软雅黑'

【2】textAlign水平对齐

textAlign 设置或返回文本内容的当前对齐方式

  • start: 默认, 文本在指定的位置开始
  • end: 文本在指定的位置结束
  • center: 文本的中心被放置在指定的位置
  • left: 文本左对齐
  • right: 文本右对齐

【3】textBaseline垂直对齐

textBaseline 设置或返回在绘制文本时使用的当前文本基线

  • alphabetic:默认,文本基线是普通的字母基线
  • top:文本基线是 em 方框的顶端
  • hanging:文本基线是悬挂基线
  • middle:文本基线是 em 方框的正中
  • ideographic: 文本基线是 em 基线
  • bottom:文本基线是 em 方框的底端

【4】文本绘制方法

填充文字: fillText(text, x, y, maxWidth)

描边文字: strokeText(text, x, y, maxWidth)

解释:

text:填充的文字

x y:坐标

maxWidth:文字最大宽度,该值小于文字宽度会自动缩小填充文字

【5】获取文字宽度方法

获取文字宽度:ctx.measureText(text)

【6】案例

<body>
  <canvas id="canvas"></canvas>
  <script>
    // 创建canvas
    const canvas = document.getElementById('canvas');
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    const ctx = canvas.getContext('2d');

    // 文字属性
    ctx.font = 'bold 200px Arial';

    // 投影
    ctx.shadowColor = 'rgba(0,0,0,0.6)';
    ctx.shadowOffsetY = 2;
    ctx.shadowBlur = 4;

    // 实体文字
    ctx.fillStyle = '#b76251';
    ctx.fillText('canvas', 50, 150);

    // 实体描边文字
    ctx.strokeStyle = '#f0d5bc';
    ctx.lineWidth = 9;
    ctx.strokeText('canvas', 50, 150);

    // 虚线描边
    ctx.strokeStyle = '#000';
    ctx.lineWidth = 1;
    ctx.setLineDash([5, 3]);
    ctx.strokeText('canvas', 50, 150);
  </script>
</body>

二、绘制图片

【1】绘制图像的基本方式(绘图+位移)

语法:ctx.drawImage(img, x,y)

参数说明:

img:是绘制图片的dom对象

x y :图片向右和向下位移坐标

【2】绘图+位移+宽高

语法:ctx.drawImage(img,x,y,width,height)

参数说明:

img:是绘制图片的dom对象

x y :图片向右和向下位移坐标

width:绘制图片的宽度

height:绘制图片的高度

【3】绘图+位移+宽高+裁剪

语法:ctx.drawImage(img,sx,sy,swidth,sheight,x,y,width,height)

参数说明:

img:是绘制图片的dom对象

sx sy: 裁剪的左上角坐标

swidth:裁剪图片的高度

sheight:裁剪的高度

x y :图片向右和向下位移坐标

width:绘制图片的宽度

height:绘制图片的高度

【4】JavaScript建立图像源的方式

// 第一种
var img = document.getElementById('imgId');

// 第二种
let img = new Image(); //这个就是img标签的dom对象
img.src = '/images/test.gif';
img.alt = '文本信息';
img.onload = function() {
  //图片加载完成后,执行此方法
};

【5】案例

<body>
  <canvas id="canvas"></canvas>
  <script>
    // 创建画布
    const canvas = document.getElementById('canvas');
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    const ctx = canvas.getContext('2d');

    // 创建图像源
    const img = new Image();
    img.src = './images/person.png';
    img.onload = function () {
      const { width, height } = img;

      // 绘图+移动 drawImage(img, x, y)
      // ctx.drawImage(img, 0, 0);

      // 绘图+移动+宽高 drawImage(img, x, y, width, height)
      ctx.drawImage(img, 0, 0, width / 5, height / 5); //偏移到x轴为0 y轴为0的位置展示, 图片宽高=原图宽高/5

      // 绘图+裁剪+移动+宽高 drawImage(img, sx, sy, swidth, sheight, x, y, width, height)
      ctx.drawImage(
        img,
        0, 0, width / 2, height / 2,  // 从左边 0,0 开始裁剪, 裁剪原图宽度的一半,高度的一半
        200, 0, width / 5, height / 5 // 偏移到x轴200y轴0的位置展示, 图片宽高=原图宽高/5
      );
    };
  </script>
</body>

三、像素操作

【1】imageData是什么?

ImageData 是图片的数据化,是一个对象,它具备以下几个属性:

data:Uint8ClampedArray[r, g, b, a, r, g, b, a, r, g, b, a, r, g, b, a]

width:整数,ImageData的宽度

heidth:整数,ImageData的高度

Uint8ClampedArray 翻译过来是 8位无符号整型固定数组,每四个数组元素代表了一个像素点的rgba信息,每个元素数值取值范围是[0,255]。若小于0,则为0,大于255,则为255。若为小数,则取整,取整的方法是银行家舍入。

【2】获取imageData对象

方法:ctx.getImageData(x, y, width, height)

作用: 用来获取canvas画布上指定矩形区域的像素数据

解释:

xy: 矩形的左顶点横纵坐标

width: 矩形的宽度

height: 矩形的高度

【3】imageData可以做什么?

我可以通过不同的算法,对ImageData 中的像素进行不同的处理。比如调整图片的色调,检测图像边缘,实现艺术效果,马赛克,人脸识别……

【4】案例

遍历图片像素,通过灰度算法对图片像素做处理使图片变成灰色调

<body>
  <canvas id="canvas"></canvas>
  <script>
    // 创建画布
    const canvas = document.getElementById('canvas');
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    const ctx = canvas.getContext('2d');

    // js创建图片源
    const img = new Image();
    img.src = 'https://img-blog.csdnimg.cn/20210407160120758.png'
    img.setAttribute('crossOrigin', '');
    img.onload = draw;

    function draw() {
      // 图像尺寸
      const { width, height } = img;

      // 在canvas 中绘制图像
      ctx.drawImage(img, 10, 10, 150, 200);

      // 从canvas 中获取图像的ImageData
      const imgData = ctx.getImageData(0, 0, width, height);
      const data = imgData.data;

      // 像素遍历
      for (let i = 0; i < data.length; i += 4) {
        const [r, g, b] = [
          data[i],
          data[i + 1],
          data[i + 2],
        ]

        // 将图片变灰,灰度算法公式: 0.299*r+0.587*g+0.114*b 
        const lm = 0.299 * r + 0.587 * g + 0.114 * b;
        data[i] = lm;
        data[i + 1] = lm;
        data[i + 2] = lm;
      }

      // 在canvas 中显示ImageData
      ctx.putImageData(imgData, 0, 0);
    }

  </script>
</body>

四、变换

【1】缩放scale()

作用:scale()方法缩放当前绘图,更大或更小

语法:ctx.scale(scalewidth,scaleheight)

scalewidth : 缩放当前绘图的宽度 (1=100%, 0.5=50%,2=200%,依次类推)

scaleheight : 缩放当前绘图的高度 (1=100%,0.5=50%,2=200%,依次类推)

注意:缩放的是整个画布,缩放后,继续绘制的图形会被放大或缩小

【2】位移translate()

语法:ctx.translate(x, y)

x: 添加到水平坐标(x)上的值

y: 添加到垂直坐标(y)上的值

注意:发生位移后,相当于把画布的 0,0 坐标 更换到新的 x,y 的位置,所有绘制的新元素都被影响。位移画布一般配合缩放和旋转等。

【3】旋转rotate()

作用:方法旋转当前的绘图

语法:context.rotate(angle)

angle:弧度(PI)

注意:参数是弧度(PI),如需将角度转换为弧度,请使用 degrees*Math.PI/180 公式进行计算

【4】绘制环境保存和还原

ctx.save() 保存当前环境的状态,可以把当前绘制环境进行保存到缓存中

ctx.restore() 恢复之前保存过的路径状态和属性,获取最近缓存的 ctx,一般配合位移画布使用

一般在我们绘制具备同一种样式的图形时,都会用save() restore() 将其包裹起来。这是为了避免当前的图形样式影响以后的图形样式。

【5】案例

<body>
  <canvas id="canvas"></canvas>
  <script>
    // 创建画布
    const canvas = document.getElementById('canvas');
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    const ctx = canvas.getContext('2d');

    // 缩放: scale(x,y)
    ctx.save()
    ctx.scale(2, 2); // 放大到200%
    ctx.fillRect(0, 0, 100, 100);
    ctx.restore()

    // 移动: translate(x,y)
    ctx.save()
    ctx.translate(250, 0); // 移动到x轴为250和y轴都为0的位置
    ctx.fillRect(0, 0, 100, 100);
    ctx.restore()

    // 旋转: rotate(angle)
    ctx.save()
    ctx.rotate(Math.PI / 4);
    ctx.fillRect(300, 0, 100, 100);
    ctx.restore()
  </script>
</body>

文章每周持续更新,可以微信搜索「 前端大集锦 」第一时间阅读,回复【视频】【书籍】领取200G视频资料和30本PDF书籍资料

相关文章

  • 三、Canvas基本绘图

    Canvas绘图(二) 本章将学习Canvas绘图的以下技巧 裁剪区域 图象合成 简单的Canvas变换 一、设置...

  • canvas学习(二)

    一、图像合并 两个重要概念 目标图像:已有图形 源图像:即将绘制的图形 一行重要代码 此行代码之后的是源图像,之前...

  • canvas学习二

    一、绘制文字 【1】font字体属性 canvas 里的font 属性和css 的font 属性是一样的,它可以设...

  • canvas学习总结(二)

    canvas学习总结(二) 一、样式设置 1、线条样式 canvas中提供了lineWidth的属性用于改变绘制出...

  • Flutter 35: 图解自定义 View 之 Canvas

    小菜前几天整理了以下 Canvas 的部分方法,今天小菜继续学习 Canvas 第二部分。 drawXXX dra...

  • Android 自定义View(学习 整理基础用法)

    学习资料 始于 onDraw(Canvas canvas) 1、canvas.drawXxx() 直接绘制所需图形...

  • 【xianyuit】20170815

    今天学习 1.【DOM转CANVAS】 大致了解了canvas可以将dom转成图片,还有二维码生成 今日看法 感悟...

  • canvas

    学习canvas

  • canvas基础学习笔记

    学习目标 1.canvas画线 2.canvas画矩形 3.canvas写字 4.canvas画圆 5.canva...

  • 自定义View学习(三)表盘

    本文学习资料 《android群英传》 先上图 学习内容(一)canvas.save()这个方法,保存画布;(二...

网友评论

      本文标题:canvas学习二

      本文链接:https://www.haomeiwen.com/subject/anuukltx.html