在Vue里,将当前窗口截图,并将数据base64转为png格式传给服务器

目录

前言

1、将当前窗口截图,并将数据存储下来

2、定义将base64转png的方法

3、完整代码

总结


前言

记录来源于需求


1、将当前窗口截图,并将数据存储下来

javascript 复制代码
export default {
data() {
 return {
   image: '' // 存储数据
  }
}
 mounted() {
  setTimeout(() => {
      // 拿到当前dom里 你需要截取的位置的id
      const dom = document.querySelector("#cesium canvas");
      if (dom) {
        // 将选择的dom元素转换为PNG格式的DataURL字符串,打印出来是base64数据
        this.image = dom.toDataURL("image/png");
      }
   },500)
 }
}

2、定义将base64转png的方法

javascript 复制代码
methods: {
     base64ImgtoFile(dataurl, filename = "file") {
      return new Promise((resolve, reject) => {
        const image = new Image();
        image.src = dataurl;
        image.onload = () => {
          const canvas = document.createElement("canvas");
          canvas.width = image.width;
          canvas.height = image.height;
          const context = canvas.getContext("2d");
          context.drawImage(image, 0, 0);
          canvas.toBlob((blob) => {
            const file = new File([blob], `${filename}.png`, {
              type: "image/png"
            });
            resolve(file);
          }, "image/png");
        };
        image.onerror = (error) => reject(error);
      });
    },
    async convertBase64ToPNG(dataurl, fileName) {
      try {
        const file = await this.base64ImgtoFile(dataurl, fileName);
        // 使用转换后的文件进行后续操作
        return file;
      } catch (error) {
        console.error(error);
      }
    },
}

3、完整代码

javascript 复制代码
<template>
  <el-button @click="handleSaveMap">提交</el-button>
</template>

<script>
export default {
  data() {
    return {
      image: "" // 存储数据
    };
  },
  mounted() {
    setTimeout(() => {
      // 拿到当前dom里 你需要截取的位置的id
      const dom = document.querySelector("#cesium canvas");
      if (dom) {
        // 将选择的dom元素转换为PNG格式的DataURL字符串,打印出来是base64数据
        this.image = dom.toDataURL("image/png");
      }
    }, 500);
  },
  methods: {
    base64ImgtoFile(dataurl, filename = "file") {
      return new Promise((resolve, reject) => {
        const image = new Image();
        image.src = dataurl;
        image.onload = () => {
          const canvas = document.createElement("canvas");
          canvas.width = image.width;
          canvas.height = image.height;
          const context = canvas.getContext("2d");
          context.drawImage(image, 0, 0);
          canvas.toBlob((blob) => {
            const file = new File([blob], `${filename}.png`, {
              type: "image/png"
            });
            resolve(file);
          }, "image/png");
        };
        image.onerror = (error) => reject(error);
      });
    },
    async convertBase64ToPNG(dataurl, fileName) {
      try {
        const file = await this.base64ImgtoFile(dataurl, fileName);
        // 使用转换后的文件进行后续操作
        return file;
      } catch (error) {
        console.error(error);
      }
    },
    // 存储数据到服务端
    async generateImages(image) {
      const file = new FileReader(); // 创建对象
      file.readAsDataURL(image); // 读取文件
      const res = await uploadApi.uploadImage(image); // 对接上传接口
      const { object, msg, success } = res.data;
      if (success) {
        this.areaPicture = object.key;
      } else this.$message.error(msg);
    },
    // 保存数据
    async handleSaveMap() {
      const loading = this.$loading({
        lock: true,
        text: "保存中,请稍后...",
        spinner: "el-icon-loading",
        background: "rgba(0, 0, 0, 0.7)"
      });
      // 截取当前窗口数据
      await this.screenshotView();
      // 转换当前base64图片数据为png
      let image = await this.convertBase64ToPNG(this.image, this.mapName);
      // 存储到服务端
      if (image) {
        await this.generateImages(image);
        console.log(this.areaPicture, "this.areaPicture");
      }
      loading.close();
    }
  }
};
</script>

总结

对你有帮助的话 点点赞吧~

相关推荐
梦曦i4 小时前
@meng-xi/create-uni-app vs unibest:轻量脚手架与重型框架的定位之争
前端·uni-app
平头哥技术团队4 小时前
Day 10 | 工欲善其事:VS Code 配置与项目归档
android·开发语言·前端·javascript·html·交互
乌恩大侠5 小时前
GH200 新增 NVMe SSD 分区、格式化与挂载完整流程
运维·服务器·前端
yume_sibai5 小时前
Element Plus 数据展示组件完全指南(15个核心组件)
前端·javascript·vue.js
qiuhaipeng15 小时前
Claude code 升级后上下文长度变短问题
java·前端·数据库
zzz_23686 小时前
个人 AI 记忆如何跨工具复用:用 Markdown、索引和 Skill 搭一个可治理的记忆库
前端·人工智能·react.js·前端框架·agent·agent测评
剑之所向7 小时前
.NET 官方`System.Threading.Channels`
前端·javascript·数据库
计算机魔术师8 小时前
GPT-6 Astra幻觉砍到2%,却被一种老招数轻松绕过
前端
cjy0001118 小时前
2026AI 产品如何从一次性 Demo 变成可重复使用的业务工具?
前端·人工智能·fde
IT_陈寒8 小时前
React的状态更新坑得我差点加班到天亮
前端·人工智能·后端