前端 借助 signature_pad 实现签名板

概述

本文介绍如何借助 signature_pad 库,实现一个网页签名板
signature_pad Github 地址
signature_pad npmjs 地址

实现步骤

  1. 准备并初始化 canvas
  2. 创建签名板
  3. 通过 SignaturePad 提供的 API, 实现签名板内容的回显、清除、保存
  4. 处理 window 的 resize 事件
1. 准备并初始化 canvas
<div class="container">
  <canvas id="canvas"></canvas>
</div>
.container {
  height: 90vh;
  margin: 10px;
}

canvas {
  width: 100%;
  height: 100%;
  border: 1px solid black;
}

使用 canvas 时,需要通过 canvas 的 width 和 height 属性指定 canvas 的宽高,width 默认值是 300px, height 默认值是 150px
通过 CSS 指定 canvas 宽高时,如果比例不是 2/1, 会导致内容比例异常,通过以下代码进行适配

/**
 * 调整 canvas 的大小
 */
function resizeCanvas() {
  const canvas = document.getElementById('canvas')
  const ratio = Math.max(window.devicePixelRatio || 1, 1)
  canvas.width = canvas.offsetWidth * ratio
  canvas.height = canvas.offsetHeight * ratio
  const context = canvas.getContext('2d')
  context.scale(ratio, ratio)
}

resizeCanvas()
2. 创建签名板
const canvas = document.getElementById('canvas')
// 创建 SignaturePad
const options = { penColor: "rgb(66, 133, 244)" }
const signaturePad = new SignaturePad(canvas, options)

此时,已经可以在 canvas 上签名了

3. 通过 SignaturePad 提供的 API, 实现签名板内容的回显、清除、保存
<button id="redisplay">回显</button>
<button id="clear">清除</button>
<button id="save">保存</button>
// DEFAULT_DATA_URL 代表一个图片的 Base64 编码
let dataURL = DEFAULT_DATA_URL

/**
 * 根据图片的 Base64 编码,把内容显示到签名板上
 */
function redisplay() {
  signaturePad && dataURL && signaturePad.fromDataURL(dataURL)
}

/**
 * 清除签名板内容
 */
function clear() {
  signaturePad.clear()
  dataURL = null
}

/**
 * 获取签名板内容(图片的 Base64 编码)
 */
function save() {
  dataURL = signaturePad.toDataURL()
  console.log(dataURL)
}

document.getElementById('redisplay').addEventListener('click', redisplay)
document.getElementById('clear').addEventListener('click', clear)
document.getElementById('save').addEventListener('click', save)
4. 处理 window 的 resize 事件
window.addEventListener('resize', () => {
  resizeCanvas()
  // 回显
  redisplay()
})

处理签名内容,把图片的 Base64 编码转换成 Blob 或 File

function base64ToBlob(dataURL) {
  let arr = dataURL.split(',')
  let mimeType = arr[0].match(/:(.*?);/)[1] || 'image/png'
  let encodeStr = atob(arr[1])
  let n = encodeStr.length
  let u8Arr = new Uint8Array(n)
  while (n--) {
    u8Arr[n] = encodeStr.charCodeAt(n)
  }
  return new Blob([u8Arr], { type: mimeType })
}

function blobToFile(blob, fileName) {
  // MIME Type
  const type = blob.type || 'text/plain'
  return new File([blob], fileName, { type })
}

const blob = base64ToBlob(dataURL)
console.log(blob)

const file = blobToFile(blob, '图片.png')
console.log(file)

代码仓库

代码仓库

注意事项

  • 转换方法 base64ToBlob 和 blobToFile 保存在 /utils/transform-utils.js
  • /libs/signature_pad.js 因为写 demo 的需要,注释掉了导出语句,需要使用 signature_pad 库时,请查看官方文档
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在图片上附加签名,你可以使用 `signature_pad` 库。首先,你需要将图片加载到 HTML 页面中,并创建一个 `canvas` 元素来显示图片和签名。然后,你可以使用 `signature_pad` 库来捕捉用户的签名,并将其绘制在 `canvas` 上。 以下是一个示例代码,展示了如何使用 `signature_pad` 库实现图片上的附签名功能: ```html <!DOCTYPE html> <html> <head> <title>Signature Pad Example</title> <script src="https://unpkg.com/signature_pad"></script> </head> <body> <h1>Signature Pad Example</h1> <!-- 用于显示图片和签名的 canvas 元素 --> <canvas id="canvas" width="500" height="300"></canvas> <button onclick="saveSignature()">保存签名</button> <script> // 加载图片 var image = new Image(); image.src = "../../../assets/img/consumer/cus1.png"; // 等待图片加载完成后执行绘制签名的逻辑 image.onload = function() { var canvas = document.getElementById('canvas'); var context = canvas.getContext('2d'); // 绘制图片 context.drawImage(image, 0, 0); // 创建 SignaturePad 实例 var signaturePad = new SignaturePad(canvas); // 保存签名的逻辑 function saveSignature() { // 获取签名数据的 base64 编码 var signatureData = signaturePad.toDataURL(); // 创建一个新的 Image 对象来加载签名数据 var signatureImage = new Image(); signatureImage.src = signatureData; // 在 canvas 上绘制签名 context.drawImage(signatureImage, 0, 0); } }; </script> </body> </html> ``` 请确保将 `../../../assets/img/consumer/cus1.png` 替换为你实际的图片路径。此示例代码将图片加载到 `canvas` 上,并在用户签名后将签名绘制在同一个 `canvas` 上。你可以根据需要对代码进行调整以满足你的具体要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值