前言

在上一篇文章 PixiJs学前篇(二):Canvas基础【中篇】 中我们了解了Canvas的基本绘制形状,接下来我们看一下如何在 Canvas 中绘制文本。

绘制文本

文本的绘制也是 Canvas 中也是比较常见的,在 Canvas 的绘制中,其实除了图片的绘制基本就是文字的绘制,两者基本五五开,下面我们开始看一下文本是如何让绘制的。

文本的绘制和基本形状的绘制一样,分为描边和填充两种,下面我们分别看一下效果

轮廓绘制:strokeText

strokeText()方法是以描边的方式绘制文字的

语法:

ctx.strokeText(txt, x, y, maxWidth)

参数:

  • txt:是绘制的文本内容
  • x、y:为绘制文本的起始位置坐标
  • maxWidth:可选参数,为文本绘制的最大宽度。

下面举个例子看一下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>canvas - 文本</title>
</head>
<body><canvasid="canvas"width="450" height="450" style="box-shadow: 0px 0px 5px #ccc; border-radius: 8px;">当前浏览器不支持canvas元素,请升级或更换浏览器!</canvas><script>const canvas = document.getElementById('canvas'); // 获取Canvasconst ctx = canvas.getContext('2d'); // 获取绘制上下文// 在(50,50)的位置绘制一段文本“掘金你好”ctx.strokeText("携手创作,共同成长,你好,掘金。", 50, 50);</script>
</body>
</html>复制代码

效果如下

如图我们看到,效果和我们预想的似乎并不一致,说好的描边,怎么感觉是“实心”的。其实这是文本绘制使用的是默认的字号和字体,导致看起来与预期的结果不太一致,这边我们设置一下字号和字体,再看一下效果

代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>canvas - 文本</title>
</head>
<body><canvasid="canvas"width="450" height="450" style="box-shadow: 0px 0px 5px #ccc; border-radius: 8px;">当前浏览器不支持canvas元素,请升级或更换浏览器!</canvas><script>const canvas = document.getElementById('canvas'); // 获取Canvasconst ctx = canvas.getContext('2d'); // 获取绘制上下文// 设置字号为:30px 字体为:Arialctx.font = "30px Arial";// 在(50,50)的位置绘制一段文本ctx.strokeText("携手创作,共同成长,你好,掘金。", 50, 50);</script>
</body>
</html>
复制代码

效果如下:

如图,效果就很明显是,是按文字的轮廓来绘制,但又有一个问题,咱们的文字超出了画布本身,那么咱们可用可续那参数: 最大宽度来限制一下看看是什么效果: 代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>canvas - 文本</title>
</head>
<body><canvasid="canvas"width="450" height="450" style="box-shadow: 0px 0px 5px #ccc; border-radius: 8px;">当前浏览器不支持canvas元素,请升级或更换浏览器!</canvas><script>const canvas = document.getElementById('canvas'); // 获取Canvasconst ctx = canvas.getContext('2d'); // 获取绘制上下文// 设置字号为:30px 字体为:Arialctx.font = "30px Arial";// 在(50,50)的位置绘制一段文本ctx.strokeText("携手创作,共同成长,你好,掘金。", 50, 50);// 在(50,100)的位置绘制一段文本,并限制最大宽度为350ctx.strokeText("携手创作,共同成长,你好,掘金。", 50, 100, 350);</script>
</body>
</html>
复制代码

效果如下:

如图我们可以看出,文案的长度被限制到了画布中,这里需要我们注意的是当文案大于最大宽度时不是裁剪或者换行,而是缩小。

填充绘制:fillText

fillText()方法是以填充的方式绘制文字的

语法:

ctx.fillText(txt, x, y, maxWidth)

参数:

  • txt:是绘制的文本内容
  • x、y:为绘制文本的起始位置坐标
  • maxWidth:可选参数,为文本绘制的最大宽度。

下面举个例子看一下fillText()和 strokeText()方法的区别。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>canvas - 文本</title>
</head>
<body><canvasid="canvas"width="450" height="450" style="box-shadow: 0px 0px 5px #ccc; border-radius: 8px;">当前浏览器不支持canvas元素,请升级或更换浏览器!</canvas><script>const canvas = document.getElementById('canvas'); // 获取Canvasconst ctx = canvas.getContext('2d'); // 获取绘制上下文// 设置字号为:30px 字体为:Arialctx.font = "30px Arial";// 在(50,50)的位置绘制一段文本ctx.strokeText("携手创作,共同成长,你好,掘金。", 50, 50);// 在(50,100)的位置绘制一段文本,并限制最大宽度为350ctx.strokeText("携手创作,共同成长,你好,掘金。", 50, 100, 350);// 在(50,150)的位置以填充的方式绘制一段文本,并限制最大宽度为350ctx.fillText("携手创作,共同成长,你好,掘金。", 50, 150, 350);</script>
</body>
</html>
复制代码

效果如下:

如图我们可以明显看出fillText()和 strokeText()方法绘制的区别。在之后的实践中我们可以按需求来选择用什么方式来绘制文本。

上面的例子中我们说道了一个属性:font,我们通过它设置了文本的样式,下面我们统一说一下在文本的绘制中,究竟有哪些文本样式可以设置。

文本样式

在文本的绘制中,样式的设置是不可或缺的,下面我们来看看究竟有哪些样式可以让我们的文本更加丰富多彩。

font

font属性的设置可以改变字号和字体,不设置的情况下默认是:10px sans-serif

举个例子看一下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>canvas - 文本</title>
</head>
<body><canvasid="canvas"width="450" height="450" style="box-shadow: 0px 0px 5px #ccc; border-radius: 8px;">当前浏览器不支持canvas元素,请升级或更换浏览器!</canvas><script>const canvas = document.getElementById('canvas'); // 获取Canvasconst ctx = canvas.getContext('2d'); // 获取绘制上下文// 默认情况ctx.strokeText("携手创作,共同成长,你好,掘金。", 50, 50);ctx.fillText("携手创作,共同成长,你好,掘金。", 50, 100);// 设置字号为:20px 字体为:Arialctx.beginPath()ctx.font = "20px Arial"; ctx.strokeText("携手创作,共同成长,你好,掘金。", 50, 200);ctx.fillText("携手创作,共同成长,你好,掘金。", 50, 250);// 设置字号为:30px 字体为:Georgiactx.beginPath()ctx.font = "30px Georgia"; ctx.strokeText("携手创作,共同成长", 50, 350);ctx.fillText("携手创作,共同成长", 50, 400);</script>
</body>
</html>
复制代码

效果如下:

textAlign

textAlign属性的设置可以改变文本对齐的方式。默认值是 start,可选值有:leftrightcenterstartend

举个例子看一下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>canvas - 文本</title>
</head>
<body><canvasid="canvas"width="450" height="450" style="box-shadow: 0px 0px 5px #ccc; border-radius: 8px;">当前浏览器不支持canvas元素,请升级或更换浏览器!</canvas><script>const canvas = document.getElementById('canvas'); // 获取Canvasconst ctx = canvas.getContext('2d'); // 获取绘制上下文// 设置字号为:20px 字体为:Arialctx.font = "20px Arial"; // 默认情况 startctx.fillText("携手创作,共同成长", 200, 50);// endctx.beginPath()ctx.textAlign = "end"; ctx.fillText("携手创作,共同成长", 200, 100);// leftctx.beginPath()ctx.textAlign = "left"; ctx.fillText("携手创作,共同成长", 200, 150);// rightctx.beginPath()ctx.textAlign = "right"; ctx.fillText("携手创作,共同成长", 200, 200);// centerctx.beginPath()ctx.textAlign = "center"; ctx.fillText("携手创作,共同成长", 200, 250);</script>
</body>
</html>
复制代码

效果如下:

如图我们可以看到各个参数对应的效果,我们会发现startleft的效果基本一样,还有endright的效果也基本一样,那么startleftendright是不是等价的呢?答案肯定是否定的。因为如果是等价的那就没必要设置两个属性了。

那他们既然不一样,那他们有什么区别呢?这我们需要结合另一个属性:direction 来看。

direction

direction属性可以设置文本的方向。默认值是 inherit, 可选值为:ltr(文本方向从左向右)、rtl(文本方向从右向左)、inherit(根据情况继承 Canvas元素或者 Document 。)。

下面我们先举个例子看一下 direction属性的各个值得效果:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>canvas - 文本</title>
</head>
<body><canvasid="canvas"width="450" height="450" style="box-shadow: 0px 0px 5px #ccc; border-radius: 8px;">当前浏览器不支持canvas元素,请升级或更换浏览器!</canvas><script>const canvas = document.getElementById('canvas'); // 获取Canvasconst ctx = canvas.getContext('2d'); // 获取绘制上下文// 设置字号为:20px 字体为:Arialctx.font = "20px Arial"; // 默认情况 inheritctx.fillText("携手创作,共同成长", 200, 50);// ltr:文本方向从左向右ctx.beginPath()ctx.direction = "ltr";ctx.fillText("携手创作,共同成长", 200, 100);// leftctx.beginPath()ctx.direction = "rtl"; ctx.fillText("携手创作,共同成长", 200, 150);</script>
</body>
</html>复制代码

效果如下:

了解了direction属性以后我们再来看看上面说到的textAlign属性的值startleftendright的区别。

举个例子看一下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>canvas - 文本</title>
</head>
<body><canvasid="canvas"width="600" height="950" style="box-shadow: 0px 0px 5px #ccc; border-radius: 8px;">当前浏览器不支持canvas元素,请升级或更换浏览器!</canvas><script>const canvas = document.getElementById('canvas'); // 获取Canvasconst ctx = canvas.getContext('2d'); // 获取绘制上下文// 设置字号为:20px 字体为:Arialctx.font = "18px Arial"; ctx.textAlign = "start"; // 起点对齐ctx.fillText("携手创作,共同成长 -> start", 300, 50);ctx.textAlign = "end"; // 结尾对齐ctx.fillText("携手创作,共同成长 -> end", 300, 100);ctx.textAlign = "left"; // 左对齐ctx.fillText("携手创作,共同成长 -> left", 300, 150);ctx.textAlign = "right"; // 右对齐ctx.fillText("携手创作,共同成长 -> right", 300, 200);ctx.textAlign = "center"; // 居中对齐ctx.fillText("携手创作,共同成长 -> center", 300, 250);// ltr: 文本方向从左向右ctx.beginPath()ctx.direction = "ltr"; ctx.textAlign = "start"; // 起点对齐ctx.fillText("携手创作,共同成长 -> ltr - start", 300, 350);ctx.textAlign = "end"; // 结尾对齐ctx.fillText("携手创作,共同成长 -> ltr - end", 300, 400);ctx.textAlign = "left"; // 左对齐ctx.fillText("携手创作,共同成长 -> ltr - left", 300, 450);ctx.textAlign = "right"; // 右对齐ctx.fillText("携手创作,共同成长 -> ltr - right", 300, 500);ctx.textAlign = "center"; // 居中对齐ctx.fillText("携手创作,共同成长 -> ltr - center", 300, 550);// 文本方向从左向右ctx.beginPath()ctx.direction = "rtl"; ctx.textAlign = "start"; // 起点对齐ctx.fillText("携手创作,共同成长 -> rtl - start", 300, 650);ctx.textAlign = "end"; // 结尾对齐ctx.fillText("携手创作,共同成长 -> rtl - end", 300, 700);ctx.textAlign = "left"; // 左对齐ctx.fillText("携手创作,共同成长 -> rtl - left", 300, 750);ctx.textAlign = "right"; // 右对齐ctx.fillText("携手创作,共同成长 -> rtl - right", 300, 800);ctx.textAlign = "center"; // 居中对齐ctx.fillText("携手创作,共同成长 -> rtl - center", 300, 850);</script>
</body>
</html>
复制代码

效果如下:

如图我们可以发现, direction 属性会对 textAlign 属性产生影响。

如果 direction 属性设置为 ltr,则textAlign属性的 left 和 start 的效果相同,right 和 end 的效果相同,

如果 direction 属性设置为 rtl,则 textAlign属性的 left 和 end 的效果相同,right 和 start 的效果相同。

textBaseline

textBaseline属性设置基于基线对齐的文字垂直方向的对齐方式。默认值是alphabetic,可选值为:tophangingmiddlealphabeticideographicbottom

举个例子看一下不同属性值的样式:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>canvas - 文本</title>
</head>
<body><canvasid="canvas"width="550" height="500" style="box-shadow: 0px 0px 5px #ccc; border-radius: 8px;">当前浏览器不支持canvas元素,请升级或更换浏览器!</canvas><script>const canvas = document.getElementById('canvas'); // 获取Canvasconst ctx = canvas.getContext('2d'); // 获取绘制上下文ctx.strokeStyle = 'red'; // 设置字体颜色ctx.font = "30px Arial"; // 设置字号为:30px 字体为:Arialconst baselines = ['top', 'hanging', 'middle', 'alphabetic', 'ideographic', 'bottom'];baselines.forEach(function (baseline, index) {ctx.textBaseline = baseline;let y = 60 + index * 60;ctx.beginPath();ctx.moveTo(10, y + 0.5);ctx.lineTo(500, y + 0.5);ctx.stroke();ctx.fillText('Hi, Welcome to my world! (' + baseline + ')', 10, y);});</script>
</body>
</html>
复制代码

效果如下:

阴影

文字设置阴影是文字绘制中常见的一种使用,绘制上阴影会让字体看起来更加立体。

Canvas中可以通过四个属性来设置阴影效果,下面我们看看这四个效果各自具体的效果。

shadowOffsetX

shadowOffsetX属性用于设置阴影在 X轴 上的延伸距离,默认值为0,如设置为10,则表示延 X轴 向右延伸10像素的阴影,也可以为负值,负值表示阴影会往反方向(向左)延伸。

shadowOffsetY

shadowOffsetY属性用于设置阴影在 Y轴 上的延伸距离,默认值为0,如设置为10,则表示延 Y轴 向下延伸10像素的阴影,也可以为负值,负值表示阴影会往反方向(向上)延伸。

shadowBlur

shadowBlur属性用于设置阴影的模糊程度,默认为 0。

shadowColor

shadowColor属性用于设置阴影的颜色,默认为全透明的黑色。

举个例子看一下上面四个属性的效果:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>canvas - 文本</title>
</head>
<body><canvasid="canvas"width="550" height="500" style="box-shadow: 0px 0px 5px #ccc; border-radius: 8px;">当前浏览器不支持canvas元素,请升级或更换浏览器!</canvas><script>const canvas = document.getElementById('canvas'); // 获取Canvasconst ctx = canvas.getContext('2d'); // 获取绘制上下文ctx.font = "30px Arial"; // 设置字号为:30px 字体为:Arialctx.shadowColor = "#cccccc"; // 设置阴影的颜色ctx.shadowOffsetX = 10; // 设置X轴上的阴影ctx.shadowOffsetY = 10; // 设置Y轴上的阴影ctx.shadowBlur = 10; // 设置阴影的模糊程度ctx.fillText("携手创作,共同成长 !", 50, 50);ctx.beginPath()ctx.shadowBlur = 5; // 设置阴影的模糊程度ctx.fillText("携手创作,共同成长 !", 50, 100);ctx.beginPath()ctx.shadowOffsetX = 30; // 设置X轴上的阴影ctx.shadowOffsetY = 30; // 设置Y轴上的阴影ctx.fillText("携手创作,共同成长 !", 50, 150);ctx.beginPath()ctx.shadowOffsetX = -10; // 设置X轴上的阴影ctx.shadowOffsetY = -10; // 设置Y轴上的阴影ctx.fillText("携手创作,共同成长 !", 50, 250);</script>
</body>
</html>
复制代码

效果如下:

measureText

measureText这个对象有很多属性,其中width属性用于基于当前上下文字号和字体来计算内联字符串的宽度。

我们看一下具体的用法:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>canvas - 文本</title>
</head>
<body><canvasid="canvas"width="550" height="500" style="box-shadow: 0px 0px 5px #ccc; border-radius: 8px;">当前浏览器不支持canvas元素,请升级或更换浏览器!</canvas><script>const canvas = document.getElementById('canvas'); // 获取Canvasconst ctx = canvas.getContext('2d'); // 获取绘制上下文var txt="携手创作,共同成长。123 Go!"ctx.font = "30px Arial"; // 设置字号为:30px 字体为:Arialctx.fillText(txt, 50, 50);ctx.fillText("字体宽度:" + ctx.measureText(txt).width,50,100)ctx.beginPath()ctx.font="30px Georgia";ctx.fillText(txt, 50, 200);ctx.fillText("字体宽度:" + ctx.measureText(txt).width, 50, 250)ctx.beginPath()ctx.font="30px Verdana";ctx.fillText(txt, 50, 350);ctx.fillText("字体宽度:" + ctx.measureText(txt).width, 50, 400)</script>
</body>
</html>复制代码

效果如下:

如图可以看出,相同的文本,在不同的字体时,文字的大小是不一样的,在我们的案例中(专栏开始说的案例),涉及到文本的修改,在修改的时候其实就涉及到需要测量文本的宽度去修改编辑框的宽度,因为 Canvas 绘制的文本是不可编辑的,所以编辑的时候需要用DOM做一个假的编辑框覆盖在 Canvas 绘制的文案上面,编辑的时候就根据DOM中文字的内容来通过上述案例计算宽度,再渲染 Canvas 上的文本。

measureText对象还有很多属性,但兼容性都不是很好,且这些属性都是只读属性,下面列一下。

  • TextMetrics.actualBoundingBoxLeft:从 textAlign 属性确定的对齐点到文本矩形边界左侧的距离,使用 CSS 像素计算;正值表示文本矩形边界左侧在该对齐点的左侧。
  • TextMetrics.actualBoundingBoxRight:从 textAlign 属性确定的对齐点到文本矩形边界右侧的距离。
  • TextMetrics.fontBoundingBoxAscent:从 textBaseline 属性标明的水平线到渲染文本的所有字体的矩形最高边界顶部的距离。
  • TextMetrics.fontBoundingBoxDescent:从 textBaseline 属性标明的水平线到渲染文本的所有字体的矩形边界最底部的距离。
  • TextMetrics.actualBoundingBoxAscent:从 textBaseline 属性标明的水平线到渲染文本的矩形边界顶部的距离。
  • TextMetrics.actualBoundingBoxDescent:从 textBaseline 属性标明的水平线到渲染文本的矩形边界底部的距离。
  • TextMetrics.emHeightAscent:从 textBaseline 属性标明的水平线到线框中 em 方块顶部的距离。
  • TextMetrics.emHeightDescent:从 textBaseline 属性标明的水平线到线框中 em 方块底部的距离。
  • TextMetrics.hangingBaseline:从 textBaseline 属性标明的水平线到线框的 hanging 基线的距离。
  • TextMetrics.alphabeticBaseline:从 textBaseline 属性标明的水平线到线框的 alphabetic 基线的距离。
  • TextMetrics.ideographicBaseline:从 textBaseline 属性标明的水平线到线框的 ideographic 基线的距离。

注意:measureText对象上的这些属性,都是使用 CSS 像素计算的,且都是只读属性。

绘制图像

上面我们说了文字的绘制,下面我们介绍一下图像的绘制。

如何把图片绘制到 Canvas 中,在上一篇文章 PixiJs学前篇(二):Canvas基础【中篇】 中,我们介绍的图像样式可以通过 createPattern 方法把图片绘制到Canvas中。

现在我们介绍一个专门用于把图片绘制到 Canvas 中的方法: drawImage,并且 drawImage方法会根据不同的传参实现不同的功能:绘制图像、缩放图像、裁剪图像。

语法:

drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)

参数:

  • image:绘制的元素(图像)。
  • sx、sy:裁剪框左上角的坐标。
  • sWidth、sHeight:裁剪框的宽度和高度。
  • dx、dy:绘制元素(图像)时左上角的坐标。
  • dWidth、dHeight:绘制元素(图像)的宽度和高度。如果不设置,则在绘制时image宽度和高度不会缩放。

下面我们分别看看传不同的参数如何实现不同的功能。以下面这张图片作为元素绘制:

绘制图像

单纯的图片绘制只需要imagedxdy三个参数。 举个例子看一下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>canvas - 图像绘制</title>
</head>
<body><canvasid="canvas"width="550" height="500" style="box-shadow: 0px 0px 5px #ccc; border-radius: 8px;">当前浏览器不支持canvas元素,请升级或更换浏览器!</canvas><script>const canvas = document.getElementById('canvas'); // 获取Canvasconst ctx = canvas.getContext('2d'); // 获取绘制上下文var img = new Image();img.src = 'https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9f56ebb2a6674e1fbd55a3d92df042bd~tplv-k3u1fbpfcp-watermark.image';img.onload = function(){ctx.drawImage(img, 0, 0);}</script>
</body>
</html>
复制代码

效果如下:

如图元素已经绘制到 Canvas 中,但可以看到图片绘制并不完整。那么想完整的绘制这张图片我们就需要在缩放图片。如何缩放呢?看下面的例子

缩放图像

想缩放图片就需要在绘制的前提下再设置图片的宽高,也就还需要dWidthdHeight这两个参数。

举个例子看一下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>canvas - 图像绘制</title>
</head>
<body><canvasid="canvas"width="550" height="500" style="box-shadow: 0px 0px 5px #ccc; border-radius: 8px;">当前浏览器不支持canvas元素,请升级或更换浏览器!</canvas><script>const canvas = document.getElementById('canvas'); // 获取Canvasconst ctx = canvas.getContext('2d'); // 获取绘制上下文var img = new Image();img.src = 'https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9f56ebb2a6674e1fbd55a3d92df042bd~tplv-k3u1fbpfcp-watermark.image';img.onload = function(){ctx.drawImage(img, 0, 0, 550, 500);}</script>
</body>
</html>
复制代码

效果如下:

如图元素已经整个的绘制到 Canvas 中了,那如果我们只需要把图片中的人物绘制到 Canvas 中,那么我们就需要对图片进行裁剪。那如何裁剪呢?

裁剪图像

想裁剪图片就需要在缩放的前提下再设置图片要显示的位置和裁剪的大小,也就还需要sxsysWidthsHeight这四个参数。

举个例子看一下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>canvas - 图像绘制</title>
</head>
<body><canvasid="canvas"width="550" height="500" style="box-shadow: 0px 0px 5px #ccc; border-radius: 8px;">当前浏览器不支持canvas元素,请升级或更换浏览器!</canvas><script>const canvas = document.getElementById('canvas'); // 获取Canvasconst ctx = canvas.getContext('2d'); // 获取绘制上下文var img = new Image();img.src = 'https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9f56ebb2a6674e1fbd55a3d92df042bd~tplv-k3u1fbpfcp-watermark.image';img.onload = function(){ctx.drawImage(img, 0, 150, 1650, 700, 0, 0, 550, 500);}</script>
</body>
</html>复制代码

效果如下:

综上所述,我们可以通过给 drawImage 方法传不同的参数来实现不同的内容。

PixiJs学前篇(三):Canvas基础【下篇】相关推荐

  1. 圆形界面 开启相机_「基础篇三」手机摄影拍照界面详解

    ​[基础篇三]手机摄影拍照界面详解 手机拍照对我们来说已习以为常,每天我们都会用手机相机功能或多或少的拍出几张照片.故手机拍照界面对我们来说也不陌生,但手机拍照界面上的那些按钮,那些功能你都用过吗?你 ...

  2. invader的java学习第三天基础篇

    invader的java学习第三天基础篇 一.整数的取值范围表 类型名称 数据类型 所占空间 表数范围 字节型 byte 1字节 -128-127 短整型 short 2字节 +-3w(-2^15-2 ...

  3. WF4.0 基础篇 (三十 完) 对学习WF的一点建议

    从09年10月份 NET4.0 Bata 2发布后,我就开始写[WF4.0 基础篇]这个系列,经历了5个多月终于在NET4.0正式发布前将这个系列完成了 这段时间与一些对WF4.0感兴趣的公司与开发人 ...

  4. H5:画布Canvas基础知识讲解(三)之文字、阴影、颜色渐变

    上一节介绍了H5:画布Canvas基础知识讲解(二)之插入图像.像素级操作,接下来继续讲解H5:画布Canvas基础. 文字 虽然最近的WebKit版本和Firefox 3.1 nightly bui ...

  5. ASP.NET MVC学前篇之Ninject的初步了解

    ASP.NET MVC学前篇之Ninject的初步了解 1.介绍 废话几句,Ninject是一种轻量级的.基础.NET的一个开源IoC框架,在对于MVC框架的学习中会用到IoC框架的,因为这种IoC开 ...

  6. Canvas基础-粒子动画Part2

    紧接上一篇文章 Canvas基础-粒子动画Part1 其实这篇早在一个星期之前就应该发了,无奈事情太多,而且我又跑去写微信公众号了. 粒子动起来 有了上一篇的基础,我们已经可以获得粒子,并将轮廓显示在 ...

  7. 人工智能之数学基础篇—高等数学基础(下篇)

    人工智能之数学基础篇-高等数学基础(下篇) 6 方向导数 6.1 方向导数的定义 6.2 方向导数的几何意义 7 梯度 8 综合实例一梯度下降法求函数的最小值 9 Python中相关库简介 9.1 S ...

  8. java负数右移_收入囊中篇---Java程序基础(二)

    前言: 本篇是接着上一篇更新的,如果没有阅读上一篇的话,可以查阅或回顾一下. 1.收入囊中篇---Java基础必备知识(一) 2.收入囊中篇---Java程序基础(二) Java程序基础目录 1.Ja ...

  9. 好程序员分享24个canvas基础知识小结

    好程序员分享24个canvas基础知识小结,非常全面详尽,推荐给大家. 现把canvas的知识点总结如下,以便随时查阅. 1.填充矩形 fillRect(x,y,width,height); 2.绘制 ...

最新文章

  1. 百度云api android,帮助文档首页/百度移动统计API/百度移动统计 Android版SDK - 百度开放云平台...
  2. Spring 4 使用Freemarker模板发送邮件添加附件
  3. mongodb 安装启动
  4. 牛客小白月赛12 I 华华和月月逛公园 (tarjian 求桥)
  5. ajax刷新iframe页面,通过iframe实现简单的ajax表单提交
  6. vim中的jk为什么是上下_JK的完整形式是什么?
  7. [置顶] Java Socket实战之一 单线程通信
  8. 来电语音播报软件下载apk_消息语音播报app下载-消息语音播报安卓版 v1.0.1 - 安下载...
  9. VC++ 限制窗口的大小范围的方法
  10. python错误提示库没有注册_SpringBoot实现登录注册常见问题解决方案
  11. ubuntu(linux)占领小米平板2(mipad2)
  12. 【持续更新】MARL 算法汇总
  13. 学习笔记(01):2019软考网络工程师--基础知识视频教程-数据通信基础(一)
  14. FloydFest 19 大赛冠军歌曲 Roll With Me,使用Peluso话筒录制
  15. 通过dns2tcp绕过校园网认证进行免费上网
  16. CIM是什么?CIM智慧城市建设路径分析
  17. WRP Ultimate 3D Endless Runner Kit - 狂徒末路跑酷角色替换教程
  18. Unity3d:UGUI,UI与特效粒子层级,2018.2以上版本BakeMesh,粒子在两个Image之间且在ScrollView
  19. java保姆级教程—— 1.什么是游戏
  20. 老婆的美丽背影------俞敏洪

热门文章

  1. 图书管理系统IO流版
  2. springboot整合security,mybatisPlus,thymeleaf实现登录认证及用户,菜单,角色权限管理
  3. 如何轻松找到竞品独立站?竞品独立站搜罗神器曝光!
  4. linux的系统性能监控
  5. 中国历史上的女子的十二种结局
  6. Erlounge III 归来,好消息一箩筐!
  7. Mac电脑的python下载、安装和环境配置——JDK+python+pycharm
  8. 1000个并发线程,10台机器,每台机器4核,设计线程池大小
  9. Wsl与Windows互相访问
  10. win7下绑定IP和MAC地址,提示ARP项添加失败,拒绝访问