Canvas简介

HTML5新增标签

Canvas API(画布)是在HTML5中新增的标签用于在网页实时生成图像,并且可以操作图像内容,基本上它是一个可以用JavaScript操作的位图(bitmap)。

Canvas 对象表示一个 HTML 画布元素 -<canvas>。它没有自己的行为,但是定义了一个 API 支持脚本化客户端绘图操作。

你可以直接在该对象上指定宽度和高度,但是,其大多数功能都可以通过CanvasRenderingContext2D 对象获得。 这是通过 Canvas 对象的getContext() 方法并且把直接量字符串 "2d" 作为唯一的参数传递给它而获得的。

<canvas> 标记在 Safari 1.3 中引入,在制作此参考页时,它在 Firefox 1.5 和 Opera 9 中也得到了支持。在 IE 中,<canvas> 标记及其 API 可以使用位于excanvas点sourceforge点net的 ExplorerCanvas 开源项目来模拟。

提示:如果希望学习如何使用 <canvas> 来绘制图形,可以访问 Mozilla 提供的Canvas 教程(英文)以及相应的中文 Canvas 教程。

这个 HTML 元素是为了客户端矢量图形而设计的。它自己没有行为,但却把一个绘图 API 展现给客户端 JavaScript 以使脚本能够把想绘制的东西都绘制到一块画布上。

<canvas> 标记由 Apple 在 Safari 1.3 Web 浏览器中引入。对 HTML 的这一根本扩展的原因在于,HTML 在 Safari 中的绘图能力也为 Mac OS X 桌面的 Dashboard 组件所使用,并且 Apple 希望有一种方式在 Dashboard 中支持脚本化的图形。

Firefox 1.5 和 Opera 9 都跟随了 Safari 的引领。这两个浏览器都支持 <canvas> 标记。

我们甚至可以在 IE 中使用 <canvas> 标记,并在 IE 的 VML 支持的基础上用开源的 JavaScript 代码(由 Google 发起)来构建兼容性的画布。

<canvas> 的标准化的努力由一个 Web 浏览器厂商的非正式协会在推进, <canvas> 已经成为 HTML 5 草案中一个正式的标签。

图片在canvas中显示,给canvas添加文字,文字描边,将canvas保存成图片下载到本地_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中显示,给canvas添加文字,文字描边,将canvas保存成图片下载到本地
    </title>
  </head>
  <body>
    <div>
      <canvas id="canvas" width="1280" height="720"></canvas>
    </div>
    <script>
      // base64转Blob对象
      const base64ToBlob = (code) => {
        let parts = code.split(';base64,')
        let contentType = parts[0].split(':')[1]
        let raw = window.atob(parts[1])
        let rawLength = raw.length
        let uint8Array = new Uint8Array(rawLength)
        for (let i = 0; i < rawLength; i++) {
          uint8Array[i] = raw.charCodeAt(i)
        }
        return new Blob([uint8Array], { type: contentType })
      }

      const download = (dataUrl, fileName) => {
        let aLink = document.createElement('a')
        let blob = base64ToBlob(dataUrl)
        let event = document.createEvent('HTMLEvents')
        event.initEvent('click', true, true)
        aLink.download = fileName + '.' + blob.type.split('/')[1]
        aLink.href = URL.createObjectURL(blob)
        aLink.click()
      }
      const init = () => {
        let canvas = document.getElementById('canvas')
        let ctx = canvas.getContext('2d')
        let image = new Image()
        image.crossOrigin = 'anonymous'
        //image.src = './1280.png'
        image.src =
          'http://localhost:85/video/grade1/chinese1-img/%E6%88%AA%E5%9B%BE%20(1).png?time=1662633780355'
        image.onload = function () {
          ctx.drawImage(image, 1, 1)
          ctx.lineWidth = 5
          ctx.font = '40px Verdana'
          let title = '10【汉语拼音】第7课、第8课:z c s 和zh ch sh r'
          let tempTitleArr = []
          for (let i = 0; i < title.length; i = i + 16) {
            let tempTitle = title.slice(i, i + 16)
            tempTitleArr.push(tempTitle)
          }
          if (
            tempTitleArr.length > 2 &&
            tempTitleArr[tempTitleArr.length - 1].length < 8
          ) {
            tempTitleArr[tempTitleArr.length - 2] =
              tempTitleArr[tempTitleArr.length - 2] +
              tempTitleArr[tempTitleArr.length - 1]
            tempTitleArr.splice(tempTitleArr.length - 1, 1)
          }
          console.log(tempTitleArr)
          tempTitleArr.forEach((item, index) => {
            ctx.strokeStyle = '#ff3333'
            ctx.strokeText(item, 10, 100 * (index + 1))
            ctx.fillStyle = '#ffff00'
            ctx.fillText(item, 10, 100 * (index + 1))
          })
          const dataUrl = canvas.toDataURL('image/png')
          console.log(dataUrl)
          download(dataUrl, '截图')
        }
      }
      init()
    </script>
  </body>
</html>