html2canvas将页面转成照片功能

vue使用html2canvas 生成照片

使用html2canvas

	// 生成快照
    convertToImage(container, options = {}) {
      // 传入dom节点宽高
      const width = container.offsetWidth;
      const height = container.offsetHeight;
       // 设置放大倍数
      const scale = window.devicePixelRatio || 1.5;

      // html2canvas的配置项
      const ops = {
        scale,
        width,
        height,
        useCORS: true,
        allowTaint: false,
        ...options,
      };

      return html2canvas(container, ops).then((canvas) => canvas.toDataURL('image/png'));
    },

	// 获取节点照片
    async getImage() {
      document.body.scrollTop = 0;
      document.documentElement.scrollTop = 0;
      // 调用函数,取到截图的二进制数据,对图片进行处理(保存本地、展示等)
      const imageData = await this.convertToImage(this.$refs.captureTable);
    },

问题解决

  1. 图片跨域
  • 设置配置项 allowTaint: false

canvas 的 CanvasRenderingContext2D 属于浏览器的对象,如果渲染过跨域资源,浏览器就认定 canvas 已经被污染了 Taint:污点

  • 设置配置项 useCORS: false

表示允许跨域资源共享,注意不能与 allowTaint 同时配置为 true

  • img 标签中添加 crossOrigin = “anonymous”

anonymous:如果使用这个值的话就会在请求 header 中带上 Origin 属性,但请求不会带上 cookie 和客户端 ssl 证书等其他的一些认证信息

  • 图片服务器配置 Access-Control-Allow-Origin: *

重要的配置项,是跨域问题的根本源泉,需要后端配合
请求图片时,带上允许跨域的响应头:Access-Control-Allow-Origin: *

  1. 截图锯齿

解决方案:根据设备像素比进行缩放

// 设置放大倍数
const scale = window.devicePixelRatio;

  1. 截图不全

截图之前将页面滚动到顶部,否则会顶部留空白

document.body.scrollTop = 0;
document.documentElement.scrollTop = 0;

  1. 部分 css3 支持不好
  • 不支持的 CSS 样式属性:

background-blend-mode、background-clip: text、box-decoration-break、repeating-linear-gradient()、font-variant-ligatures、mix-blend-mode、writing-mode、writing-mode、border-image、box-shadow、filter、zoom、transform

  • 不支持使用rem单位定义文字大小、元素宽高等,不然无法显示该元素

文章参考: html2canvas使用总结.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果不想使用 `type="file"`,可以使用 JavaScript 和 Canvas API 来实现一个简单的照片上传功能。以下是一个简单的示例代码,供参考: HTML 代码: ```html <!-- 显示上传的图片 --> <div id="preview"></div> <!-- 点击按钮触发上传 --> <button onclick="upload()">上传图片</button> ``` JavaScript 代码: ```javascript function upload() { // 创建一个 input 元素 var input = document.createElement("input"); // 设置 input 的 type 属性为 "file" input.type = "file"; // 隐藏 input 元素 input.style.display = "none"; // 将 input 元素添加到页面中 document.body.appendChild(input); // 监听 input 元素的 change 事件 input.addEventListener("change", function() { // 获取上传的文件 var file = input.files[0]; // 创建一个 FileReader 对象 var reader = new FileReader(); // 监听 FileReader 对象的 load 事件 reader.addEventListener("load", function() { // 创建一个 Image 对象 var img = new Image(); // 监听 Image 对象的 load 事件 img.addEventListener("load", function() { // 创建一个 Canvas 对象 var canvas = document.createElement("canvas"); // 设置 Canvas 的宽度和高度 canvas.width = img.width; canvas.height = img.height; // 将图片绘制到 Canvas 上 var ctx = canvas.getContext("2d"); ctx.drawImage(img, 0, 0, img.width, img.height); // 将 Canvas 转换为 Base64 编码的数据 var dataURL = canvas.toDataURL(); // 显示上传的图片 var preview = document.getElementById("preview"); preview.innerHTML = '<img src="' + dataURL + '">'; // 可以将 dataURL 发送到服务器,进行保存等操作 // ... // 移除 input 元素 document.body.removeChild(input); }); // 加载图片 img.src = reader.result; }); // 读取文件 reader.readAsDataURL(file); }); // 触发 input 元素的 click 事件 input.click(); } ``` 这个示例代码通过创建一个 `input` 元素,并设置 `type="file"`,然后隐藏 `input` 元素,通过 JavaScript 监听 `input` 元素的 `change` 事件,获取上传的文件,使用 `FileReader` 对象将文件读取为 Base64 编码的数据,然后创建一个 `Image` 对象,加载图片并监听 `load` 事件,将图片绘制到 `Canvas` 上,将 `Canvas` 转换为 Base64 编码的数据,显示上传的图片,并可以将数据发送到服务器进行保存等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值