html2canvas 合成图片 跨域问题处理 及 点击保存图片(与客户端交互)

本文介绍了如何在前端使用html2canvas捕获页面并保存图片,同时处理跨域问题。通过配置CORS和设置图片质量,确保了图片清晰。此外,还展示了如何上传图片到腾讯云,并通过JSBridge进行服务器交互。
<img class="avatar" crossorigin='anonymous' v-formatImage :src="personal.icon" alt="">

crossorigin=‘anonymous’ 必须加上该属性

v-formatImage 为默认图片指令

// 点击 保存图片
 save() {
     this.loading = true
     this.stopBodyScroll(true) // 锁定滚动条 必须锁定不然合成图片会变形

     html2canvas(document.querySelector('#capture'), {
         	dpi: window.devicePixelRatio * 4,  // 需加上该属性 不然图片会模糊
            useCORS: true,
            logging: true,
            allowTaint: true,
            scale: 2, // 需加上该属性 不然图片会模糊
            backgroundColor: 'transparent'
     }).then(canvas => {
         const base64Url = canvas.toDataURL('image/png', 1)

         this.saveImageToPhoneAlbum(this.dataURLtoFile(base64Url)) // 需转化成base64格式
     })
 },

 // 保存图片到手机
 async saveImageToPhoneAlbum(base64Url) {
     const res = await uploadImg(base64Url) // 上传图片 需取到上传服务器之后绝对路径

     this.dataURL = newParsingPath(res.data.url)

     console.log('this.dataURL: ', this.dataURL)

     jsBridgeClient.saveImage(this.dataURL) // 与客户端交互方法
     this.stopBodyScroll(false) // 解除滚动条
     this.loading = false
 },

 //将base64转换为blob 再转为file文件流
 dataURLtoFile(dataUrl, filename = '123456.png') {
     let arr = dataUrl.split(','),
         mime = arr[0].match(/:(.*?);/)[1],
         bstr = atob(arr[1]),
         n = bstr.length,
         u8arr = new Uint8Array(n)
     while (n--) {
         u8arr[n] = bstr.charCodeAt(n)
     }
     let blob = new Blob([u8arr], { type: mime })
     return new window.File([blob], filename, { type: 'image/jpeg' })
 },

 // 上传图片请求
 async uploadImg(base64Url = '') {
     try {
         const res = await uploadImg(base64Url)  // 上传图片方法 封装 (这里后端返回是相对路径)
         let url = res.data.url
         if (url) {
             const domain = `https: //upload.com`  // 服务器域名  (需拼接绝对路径)
             this.pageData.imgUrl = domain + url
         } else {
             console.log('取消上传')
             // this.$toast('取消图片上传')
         }
     } catch (e) {
         this.$toast('图片上传失败,请重新上传!')
     }
 },

 stopBodyScroll(isFixed) {
     if (isFixed) {
         this.scrollTop = document.scrollingElement.scrollTop || window.scrollY

         document.body.style.position = 'fixed'
         document.body.style.top = -this.scrollTop + 'px'
     } else {
         document.body.style.position = 'relative'
         document.body.style.top = 'unset'

         window.scrollTo(0, this.scrollTop) // 回到原先的top
     }
 }

Tips: 1、如果出现跨域问题,请配置Http header头 。
2、请仔细看代码注释

以下有使用腾讯云设置解决方法及链接

腾讯云对象存储

设置跨域访问

官网文档: link.

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

腾讯云内容分发网络CDN

设置跨域访问

官网文档: link.

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值