vue 将页面保存为图片下载到本地

该文章介绍了如何利用html2canvas库,结合JavaScript将网页内容转化为Canvas,然后转换为图片并进行下载。主要步骤包括安装html2canvas,选取需要截屏的DOM元素,生成Canvas,调整图片格式,最后将Base64编码的图片转为Blob对象以实现本地下载。

首先先下载一个插件html2canvas帮助我们实现

npm i html2canvas

 dom部分 废话不多说,直接上代码

<div class="box">
      <!-- 将可保存为图片的内容 通过一个 标签 框起来 -->
      <div id="screenshot-box">
  
      </div>
      <button @click="onSaveCanvas">保存图片</button>
</div>

js逻辑

将插件导入到要使用的页面

  import html2canvas from "html2canvas";
//点击保存为Canvas
      onSaveCanvas() {
        // 这里的类名要与点击事件里的一样
        const canvas = document.querySelector("#screenshot-box");
        let that = this;
        html2canvas(canvas, { scale: 2, logging: false, useCORS: true }).then(
          function (canvas) {
            const type = "png";
            let imgData = canvas.toDataURL(type);
            // 图片格式处理
            let _fixType = function (type) {
              type = type.toLowerCase().replace(/jpg/i, "jpeg");
              let r = type.match(/png|jpeg|bmp|gif/)[0];
              return "image/" + r;
            };
            imgData = imgData.replace(_fixType(type), "image/octet-stream");
            let filename = "htmlImg" + "." + type;
            // 保存为文件
            //  以bolb文件下载
            that.downFileToLocal(filename, that.convertBase64ToBlob(imgData));
          }
        );
      },

// base64转化为Blob对象
      convertBase64ToBlob(imageEditorBase64) {
        let base64Arr = imageEditorBase64.split(",");
        let imgtype = "";
        let base64String = "";
        if (base64Arr.length > 1) {
          //如果是图片base64,去掉头信息
          base64String = base64Arr[1];
          imgtype = base64Arr[0].substring(
            base64Arr[0].indexOf(":") + 1,
            base64Arr[0].indexOf(";")
          );
        }
        // 将base64解码
        let bytes = atob(base64String);
        //let bytes = base64;
        let bytesCode = new ArrayBuffer(bytes.length);
        // 转换为类型化数组
        let byteArray = new Uint8Array(bytesCode);
  
        // 将base64转换为ascii码
        for (let i = 0; i < bytes.length; i++) {
          byteArray[i] = bytes.charCodeAt(i);
        }
        // 生成Blob对象(文件对象)
        return new Blob([bytesCode], { type: imgtype });
      },
      // 下载Blob流文件
      downFileToLocal(fileName, blob) {
        // 创建用于下载文件的a标签
        const d = document.createElement("a");
        // 设置下载内容
        d.href = URL.createObjectURL(blob);
        // 设置下载文件的名字
        d.download = fileName;
        // 界面上隐藏该按钮
        d.style.display = "none";
        // 放到页面上
        document.body.appendChild(d);
        // 点击下载文件
        d.click();
        // 从页面移除掉
        document.body.removeChild(d);
        // 释放 URL.createObjectURL() 创建的 URL 对象
        window.URL.revokeObjectURL(d.href);
      },

样式

#screenshot-box {
    width: 100%;
    height: 600px;
    background-color: aquamarine;
  }

完整代码

<template>
    <div class="box">
      <!-- 将可保存为图片的内容 通过一个 标签 框起来 -->
      <div id="screenshot-box">
  
      </div>
      <button @click="onSaveCanvas">保存图片</button>
    </div>
  </template>
  <script>
  //引入html2canvas
  import html2canvas from "html2canvas";
  import axios from 'axios'
  export default {
    name: "Html2Image",
    props: {
      id: {
        // id
        type: String,
        default: "export-box",
      },
      filename: {
        // 导出文件名称
        type: String,
        default: "htmlPic",
      },
      outType: {
        // 导出类型
        type: String,
        default: "png",
        validator(value) {
          return ["png", "jpg", "bmp", "jpeg", "gif"].includes(value);
        },
      },
      isFile: {
        // 是否为导出文件
        type: Boolean,
        default: false,
      },
    },
    mounted(){
      axios.post('https://api.weixin.qq.com/cgi-bin/token',{
        grant_type:'',
        appid:'',
        secret:''
      },(res)=>{
        console.log(res);
      })
      console.log(axios);
    },
    methods: {
      //点击保存为Canvas
      onSaveCanvas() {
        // 这里的类名要与点击事件里的一样
        const canvas = document.querySelector("#screenshot-box");
        let that = this;
        html2canvas(canvas, { scale: 2, logging: false, useCORS: true }).then(
          function (canvas) {
            const type = "png";
            let imgData = canvas.toDataURL(type);
            // 图片格式处理
            let _fixType = function (type) {
              type = type.toLowerCase().replace(/jpg/i, "jpeg");
              let r = type.match(/png|jpeg|bmp|gif/)[0];
              return "image/" + r;
            };
            imgData = imgData.replace(_fixType(type), "image/octet-stream");
            let filename = "htmlImg" + "." + type;
            // 保存为文件
            //  以bolb文件下载
            that.downFileToLocal(filename, that.convertBase64ToBlob(imgData));
          }
        );
      },
      // base64转化为Blob对象
      convertBase64ToBlob(imageEditorBase64) {
        let base64Arr = imageEditorBase64.split(",");
        let imgtype = "";
        let base64String = "";
        if (base64Arr.length > 1) {
          //如果是图片base64,去掉头信息
          base64String = base64Arr[1];
          imgtype = base64Arr[0].substring(
            base64Arr[0].indexOf(":") + 1,
            base64Arr[0].indexOf(";")
          );
        }
        // 将base64解码
        let bytes = atob(base64String);
        //let bytes = base64;
        let bytesCode = new ArrayBuffer(bytes.length);
        // 转换为类型化数组
        let byteArray = new Uint8Array(bytesCode);
  
        // 将base64转换为ascii码
        for (let i = 0; i < bytes.length; i++) {
          byteArray[i] = bytes.charCodeAt(i);
        }
        // 生成Blob对象(文件对象)
        return new Blob([bytesCode], { type: imgtype });
      },
      // 下载Blob流文件
      downFileToLocal(fileName, blob) {
        // 创建用于下载文件的a标签
        const d = document.createElement("a");
        // 设置下载内容
        d.href = URL.createObjectURL(blob);
        // 设置下载文件的名字
        d.download = fileName;
        // 界面上隐藏该按钮
        d.style.display = "none";
        // 放到页面上
        document.body.appendChild(d);
        // 点击下载文件
        d.click();
        // 从页面移除掉
        document.body.removeChild(d);
        // 释放 URL.createObjectURL() 创建的 URL 对象
        window.URL.revokeObjectURL(d.href);
      },
    },
  };
  </script>
  <style scoped>
  #screenshot-box {
    width: 100%;
    height: 600px;
    background-color: aquamarine;
  }
  </style>

Vue中实现图片保存下载本地有多种应用场景,以下是不同场景下的实现方法: ### 长按保存图片 在移动互联网应用里,用户常有保存页面特定内容为图片的需求,如保存二维码、海报等。要在Vue项目中通过长按操作保存图片,可结合具体代码实现。不过引用中未给出具体代码,一般实现思路是监听图片的长按事件,触发后使用合适的方法保存图片。 ### 调用浏览器摄像头拍照并保存 #### Vue2项目 在vue2 | nuxt2项目开发中,可实现网站开启摄像头并拍照上传服务器或保存本地功能。在浏览器网页上能调用前置摄像头与后置摄像头,调节电脑摄像头权限并在网页弹出使用摄像头的授权弹框,调取本地摄像头拍照生成对应抓拍的图片临时路径或base64数据,适用于移动端H5网页、PC网站,支持多种浏览器。解决了打不开摄像头、摄像头黑屏、权限拒绝、部署线上打不开、拍照报错、浏览器不兼容、拍照后保存或上传等问题 [^2]。 #### Vue3项目 在vue3、nuxt3项目中,可实现网站打开摄像头拍照,支持将抓拍的图像保存到用户本地或上传到服务器。解决了调用摄像头权限无法弹出、打不开摄像头、摄像头黑屏、默认后置摄像头、浏览器不兼容等问题。使用`navigator.mediaDevices.getUserMedia`调用相机功能,调取本地摄像头拍照生成对应抓拍的图片临时路径或base64数据 [^3]。 ### 生成二维码图片下载Vue中可封装组件生成二维码图片下载。以下是示例代码: ```vue <template> <div> <div id="qrcode"></div> </div> </template> <script> // 二维码 import QRCode from 'qrcodejs2' // 引入qrcode export default { name: 'test', mounted() { this.qrcode(); }, props: { width: { type: Number, default () { return 200 } }, height: { type: Number, default () { return 200 } }, // 二维码地址 url: { type: String, default () { return '' } } }, methods: { qrcode() { let qrcode = new QRCode('qrcode', { width: this.width, height: this.height, text: this.url, colorDark: "#000", colorLight: "#fff", }) }, } } </script> <style scoped> #qrcode { display: inline-block; } #qrcode img { width: 132px; height: 132px; background-color: #fff; padding: 6px; } </style> ``` 生成二维码后,可通过获取二维码图片的`src`属性,再使用合适的方法将其保存本地 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值