canvas基础入门系列教程(6)-绘制图片

4.绘制图片

在canvas中使用到的图片并不是通过js去画的,如果每张图片都是用js去画,那么会相当麻烦,例如:游戏开发中的地图、背景、人物等,这些素材如果直接用js去画,先不考虑难度问题,就是画这些内容工作量就非常大了,因此,canvas提供了方法可以直接讲图片加载到canvas中,这样就方便多了

4.1.绘制图片体验

在canvas中绘制图片,实际上说的是把图片加载到canvas中,我们需要通过canvas的drawImage方法来完成

// 语法
ctx.drawImage(image, dx, dy)

参数说明

image 图片对象
dx 目标画布的左上角在目标canvas上 X 轴的位置。
dy 目标画布的左上角在目标canvas上 Y 轴的位置。

canvas基础入门系列教程(6)-绘制图片

实例:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    #cvs{
      border: 1px solid #ddd;
    }
  </style>
</head>
<body>
  <canvas width="600" height="300" id="cvs"></canvas>
  <script>
    var oCanvas = document.getElementById('cvs')
    var ctx = oCanvas.getContext('2d')
    var oImg = new Image()
    oImg.src = 'img/2019-01-17-16-24-40.png'
    oImg.onload = function () {
      ctx.drawImage(oImg, 0, 0)
    }
    
  </script>
</body>
</html>

4.2.drawImage方法的其他调用方式

drawImage还有两种调用方式,主要是传入参数的不同

// 第二种调用方式
ctx.drawImage(image, dx, dy, dWidth, dHeight);

参数说明

image 图片对象
dx 目标画布的左上角在目标canvas上 X 轴的位置。
dy 目标画布的左上角在目标canvas上 Y 轴的位置。
dWidth 可选,在目标画布上绘制图像的宽度。 允许对绘制的图像进行缩放。 如果不说明, 在绘制时图片宽度不会缩放。
dHeight 可选,在目标画布上绘制图像的高度。 允许对绘制的图像进行缩放。 如果不说明, 在绘制时图片高度不会缩放

这种方式只是比第一种方式多了宽度和高度设置,可以对图片进行缩放后显示到canvas上

实例:

var oCanvas = document.getElementById('cvs')
var ctx = oCanvas.getContext('2d')
var oImg = new Image()
oImg.src = 'img/2019-01-17-16-24-40.png'
oImg.onload = function () {
  ctx.drawImage(oImg, 0, 0, 100, 200)
}   
// 第三种调用方式
ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);

参数说明

image 图片对象
dx 目标画布的左上角在目标canvas上 X 轴的位置。
dy 目标画布的左上角在目标canvas上 Y 轴的位置。
dWidth 可选,在目标画布上绘制图像的宽度。 允许对绘制的图像进行缩放。 如果不说明, 在绘制时图片宽度不会缩放。
dHeight 可选,在目标画布上绘制图像的高度。 允许对绘制的图像进行缩放。 如果不说明, 在绘制时图片高度不会缩放。
sx 可选,需要绘制到目标上下文中的,源图像的矩形选择框的左上角 X 坐标。
sy 可选,需要绘制到目标上下文中的,源图像的矩形选择框的左上角 Y 坐标。
sWidth 可选,需要绘制到目标上下文中的,源图像的矩形选择框的宽度。如果不说明,整个矩形从坐标的sx和sy开始,到图像的右下角结束。
sHeight 可选,需要绘制到目标上下文中的,源图像的矩形选择框的高度。
var oCanvas = document.getElementById('cvs')
var ctx = oCanvas.getContext('2d')
var oImg = new Image()
oImg.src = 'img/2019-01-17-16-24-40.png'
oImg.onload = function () {
  ctx.drawImage(oImg, 50, 80, 100, 200, 30, 30, 100, 200)
}
    

sx, sy, sWidth, sHeight这4个参数操作的是源文件,根据这4个参数把图片截取下来,然后根据dx, dy, dWidth, dHeight这4个参数显示到canvas中

4.3.图片平铺

我们可以使用createPattern和fillRect来实现图片的平铺效果

// 语法
ctx.createPattern(image, repetition)

参数说明

image 图片对象
repetition 指定如何重复图像

说明:repetition可以取以下值
repeat  (both directions,水平和垂直放向都平铺)
repeat-x (horizontal only, 水平方向平铺)
repeat-y (vertical only, 垂直放向平铺)
no-repeat (neither, 不平铺)

实例:

var oCanvas = document.getElementById('cvs')
var ctx = oCanvas.getContext('2d')
var oImg = new Image()
oImg.src = 'img/2019-01-17-17-15-44.png'

oImg.onload = function () {
  // ctx.drawImage(oImg, 50, 80, 100, 200, 30, 30, 100, 200)
  var pattern = ctx.createPattern(oImg, 'repeat')
  ctx.fillStyle = pattern
  ctx.fillRect(0, 0, 300, 300)
}

canvas基础入门系列教程(6)-绘制图片

4.4.图片剪切

做图片剪切需要用到clip方法

// 语法
ctx.clip()

剪切图片的步骤:

1. 绘制一个图形作为剪切区域

2. 调用clip方法

3. 绘制图片

实例:

var oCanvas = document.getElementById('cvs')
var ctx = oCanvas.getContext('2d')

// 1. 绘制剪切区域
ctx.beginPath()
ctx.arc(100, 100, 50, 0, 360 * Math.PI/180)
ctx.closePath()
ctx.strokeStyle = "red"
ctx.stroke()

// 2. 调用方法
ctx.clip()

// 3. 绘制被剪切图像
var oImg = new Image()
oImg.src = 'img/2019-01-17-16-24-40.png'

oImg.onload = function () {
  // ctx.drawImage(oImg, 50, 80, 100, 200, 30, 30, 100, 200)
  var pattern = ctx.createPattern(oImg, 'repeat')
  ctx.fillStyle = pattern
  ctx.fillRect(0, 0, 300, 300)
}

课程地址:http://edu.nodeing.com/course/80