Vue使用html2canvas实现截取图片并保存

 更新时间:2023年12月21日 15:28:34   作者:我是ed  
html2canvas是一个JavaScript库,它可以将HTML元素转换为Canvas元素本文将介绍一下Vue如何使用html2canvas实现截取图片并保存功能,需要的可以参考下

html2canvas 简介

html2canvas是一个JavaScript库,它可以将HTML元素转换为Canvas元素。具体来说,它可以将整个页面或特定的HTML元素转换为一幅图像,这对于创建屏幕截图、生成PDF文件或在上创建可编辑的图像非常有用。

html2canvas 安装

安装 html2canvas 很简单,只需要一个简单的命令即可。

npm install html2canvas --save

等待命令执行完成就可以了。

html2canvas 使用

使用的时候也非常的方便。首先在需要使用的地方进行引入。

import html2canvas from 'html2canvas'

在 Vue 组件中使用 html2canvas 将 HTML 元素转换为 canvas:

methods: {  
  convertToCanvas() {  
    const element = this.$refs.element // 获取要转换的HTML元素  
    html2canvas(element).then(canvas => {  
      // 在这里可以对canvas进行操作,例如将其添加到页面中或保存为图片等  
      // 例如:this.$refs.canvasContainer.appendChild(canvas)  
    })  
  }  
}

在模板中添加要转换的HTML元素和调用方法的引用:

<template>  
  <div>  
    <div ref="element">要转换的HTML元素</div>  
    <button @click="convertToCanvas">转换为Canvas</button>  
    <div ref="canvasContainer"></div>  
  </div>  
</template>

当用户点击按钮时,convertToCanvas方法将被调用,它将获取要转换的HTML元素并使用html2canvas将其转换为canvas。转换完成后,可以在then回调函数中对canvas进行操作,例如将其添加到页面中或保存为图片等。

案例:保存缩略图

之前在项目里面写过一个功能,就是把页面保存成缩略图展示。需要获取这个页面的截图,然后把截图数据发送给后端,后端保存起来,然后查询列表的时候后端返回保存的缩略图进行展示。就是引用上面的步骤:

    // 获取截图
    getPicture() {
      html2canvas(this.$refs.panelPage).then(canvas => {
        // 获取生成的图片的url,并设置为png格式
        const imgUrl = canvas.toDataURL("images/png");
        let base64Data = imgUrl.split(",")[1];
        let binaryData = atob(base64Data);
        let uint8Array = new Uint8Array(binaryData.length);
        for (let i = 0; i < binaryData.length; i++) {
          uint8Array[i] = binaryData.charCodeAt(i);
        }
        // 获取blob文件流
        let blob = new Blob([uint8Array], { type: "image/png" });
        // 文件流转文件
        let file = new File([blob], "filename.png", {
          type: "image/png",
        });
        let fd = new FormData()
        fd.append('file', file)
        
        // 请求后端数据接口
        coverUpload(fd) 
      })
    },

上面获取了截图之后调用请求接口的方法就OK了。

这样就可以把页面的截图获取下来,然后保存缩略图到后端。但是在实际使用上发现一个大问题,就是我引用的网络图片获取截取不下来。于是找了一下原因:是因为跨域的问题导致觉得不安全,就没有截取。

解决这个问题也很简单,配置一下允许跨域,上面代码改一下:

    // 获取截图
    getPicture(id) {
      html2canvas(this.$refs.panelPage, {
        useCORS: true,  // 开启跨域
      }).then(canvas => {
        // 获取生成的图片的url,并设置为png格式
        const imgUrl = canvas.toDataURL("images/png");
        let base64Data = imgUrl.split(",")[1];
        let binaryData = atob(base64Data);
        let uint8Array = new Uint8Array(binaryData.length);
        for (let i = 0; i < binaryData.length; i++) {
          uint8Array[i] = binaryData.charCodeAt(i);
        }
        // 获取blob文件流
        let blob = new Blob([uint8Array], { type: "image/png" });
        // 文件流转文件
        let file = new File([blob], "filename.png", {
          type: "image/png",
        });
        let fd = new FormData()
        fd.append('file', file)
        // 请求后端数据接口
        coverUpload(id, fd)
      })
    },

主要就是这一句代码:useCORS: true

但是发现有些还不行,为啥呢,因为他需要服务端开启跨域 response.setHeader("Access-Control-Allow-Origin","*") ;。如果是自己的服务器的话,那改一下 nginx 的代理配置就可以了。

location /imgSource/ {
	# 加上这三行就可以了
	add_header Access-Control-Allow-Origin *;
	add_header Access-Control-Allow-Headers X-Requested-With;
	add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
	
	autoindex on;
	alias C:/Users/11466/Desktop/serve/classe/image/;
}

这样就能截取下来了,反正我是成功了。

到此这篇关于Vue使用html2canvas实现截取图片并保存的文章就介绍到这了,更多相关Vue html2canvas截图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue.js模仿京东省市区三级联动的选择组件实例代码

    vue.js模仿京东省市区三级联动的选择组件实例代码

    选择省市区是我们大家在填写地址的时候经常会遇到的一个功能,下面这篇文章主要给大家介绍了关于利用vue.js模仿实现京东省市区三级联动选择组件的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-11-11
  • 详解mpvue scroll-view自动回弹bug解决方案

    详解mpvue scroll-view自动回弹bug解决方案

    设置了scroll-top的scroll-view组件,在组件所在vue实例data发生改变时会自动回弹到最上方,非常具有实用价值,需要的朋友可以参考下
    2018-10-10
  • 详解Vue router路由

    详解Vue router路由

    这篇文章主要为大家介绍了Vue 的router路由,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • 如何在Vue项目中添加接口监听遮罩

    如何在Vue项目中添加接口监听遮罩

    这篇文章主要介绍了如何在Vue项目中添加接口监听遮罩,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Vue生命周期详解

    Vue生命周期详解

    本文详细讲解了Vue的生命周期,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 使用Vue-cli 中为单独页面设置背景图片铺满全屏

    使用Vue-cli 中为单独页面设置背景图片铺满全屏

    这篇文章主要介绍了使用Vue-cli 中为单独页面设置背景图片铺满全屏,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Vue3中同时定义多个插槽的实现示例

    Vue3中同时定义多个插槽的实现示例

    本文主要介绍了Vue3中同时定义多个插槽的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • Vue实现当前页面刷新的4种方法举例

    Vue实现当前页面刷新的4种方法举例

    我们在开发vue的页面的时候,有时候会遇到需要刷新当前页面功能,但是vue框架自带的router是不支持刷新当前页面功能,下面这篇文章主要给大家介绍了关于Vue实现当前页面刷新的4种方法,需要的朋友可以参考下
    2023-04-04
  • vue.js购物车添加商品组件的方法

    vue.js购物车添加商品组件的方法

    这篇文章主要介绍了vue.js购物车添加商品组件的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • vue.js实例对象+组件树的详细介绍

    vue.js实例对象+组件树的详细介绍

    这篇文章主要介绍了vue.js实例对象+组件树的相关资料,需要的朋友可以参考下
    2017-10-10

最新评论