html2canvas(将dom元素转为canvas),wxml2canvas(微信小程序)

这篇具有很好参考价值的文章主要介绍了html2canvas(将dom元素转为canvas),wxml2canvas(微信小程序)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

某些场景需要通过 canvas 绘制一些图片, 其中包含一些文字、可能的二维码等等。 然后实现时如果完全手动的去定位元素在 canvas 中的位置,结果就会产生大量不能复用和难以维护的代码。(使用背景图可能会模糊,可以使用img,结合定位)

html2canvas

1.安装

npm install --save html2canvas

  也可以直接官网下载js文件 然后引用

  2. 使用

//按自己的文件位置引用
import html2canvas from "../../utils/html2canvas.js";

canvasfun() {
      //把你需要转为图片的标签放在一个根元素内 直接获取根元素
      let save2 = document.getElementsByClassName('list')[0];
      html2canvas(save2,{
        useCORS: true  //很重要支持跨域图片,否则需要自己将线上图片转为本地图片(转base64)
      }).then((canvas) => {
        //利用a标签实现下载(浏览器环境)
        let url = canvas.toDataURL("image/png");
        let aLink = document.createElement("a");
        aLink.style.display = "none";
        url.replace(/^data:image\/png/, "data:application/octet-stream")
        aLink.href = url;
        aLink.download = "截图.png";
        document.body.appendChild(aLink);
        aLink.click();
        document.body.removeChild(aLink);
        console.log(canvas)

//***********************************************************
        //小程序webview页面
        let url = canvas.toDataURL("image/png");
        url.replace(/^data:image\/png/, "data:application/octet-stream")
        console.log(canvas)
        wx.miniProgram.postMessage({
          data: { 
            base64: url
          }
        });
        //触发 wx.miniProgram.postMessage的bindmessage
        wx.miniProgram.redirectTo({
          url: '此页面路径',
        })



      });
    },

 3.属性

属性名 默认值 描述
allowTaint false 是否允许跨域图像。会污染画布,导致无法使用canvas.toDataURL 方法
backgroundColor #ffffff 画布背景色(如果未在DOM中指定)。设置null为透明
canvas null 现有canvas元素用作绘图的基础

foreignObjectRendering

false 如果浏览器支持,是否使用ForeignObject渲染
imageTimeout 15000 加载图像的超时时间(以毫秒为单位)。设置0为禁用超时。
ignoreElements (element) => false 谓词功能,可从渲染中删除匹配的元素
logging true 启用日志以进行调试
onclone null 克隆文档以进行渲染时调用的回调函数可用于修改将要渲染的内容,而不会影响原始源文档。
proxy null 代理将用于加载跨域图像的网址。如果保留为空,则不会加载跨域图像。
removeContainer true 是否清除html2canvas临时创建的克隆DOM元素
scale

window.devicePixelRatio

用于渲染的比例。默认为浏览器设备像素比率。(图片清晰控制)
useCORS false 是否尝试使用CORS从服务器加载图像
width Element width canvas的宽度
height Element height canvas的高度
x Element x-offset 裁剪画布X坐标
y Element y-offset 裁剪画布y坐标
scrollX Element scrollX 渲染元素时要使用的x滚动位置(例如,如果Element使用position: fixed)
scrollY Element scrollY 呈现元素时要使用的y-scroll位置(例如,如果Element使用position: fixed)
windowWidth Window.innerWidth 渲染时使用的窗口宽度Element,这可能会影响媒体查询之类的内容
windowHeight Window.innerHeight

渲染时要使用的窗口高度Element,这可能会影响媒体查询之类的内容

如果应用在小程序webview中,需要将base64传到小程序端通过 wx.miniProgram.postMessage(小程序后退、组件销毁、分享、复制链接才会触发)传,然后再web-view标签上绑定bindmessage="callback",通过wx.miniProgram.redirectTo重新打开此页面触发(看着最合适的方式)

//接上面webview的代码
<web-view src="{{srchtml}}"  bindmessage="callback"/>




callback(e){
      var data = e.detail.data
      console.log(data)

      let img =  e.detail.data[data.length-1].base64
      let imgname = new Date().getTime()

      wx.getFileSystemManager().writeFile({
      filePath: wx.env.USER_DATA_PATH + '/'+ imgname + '.png',  //这里先把文件写到临时目录里. 
      data: img.slice(22), //****************
      encoding: 'base64',
      success: res => {
        console.log('success')
        wx.saveImageToPhotosAlbum({
          filePath: wx.env.USER_DATA_PATH + '/'+ imgname + '.png', //这是把临时文件 保存到 相册
          success: res => {
            wx.showToast({ title: '保存成功!' })
          },
          fail: error => { console.log(error) }
        })
      },
      fail: error => { console.log(error) }
    })
    },

wxml2canvas

有的github上的文件有点问题

从这里拷js文件,把demo下载下来跑一遍

分析一下

 drawCanvas() {
    wx.showLoading()
    const that = this
    const query = wx.createSelectorQuery().in(this);
    query.select('#wrapper').fields({ // 选择需要生成canvas的范围
        size: true,
        scrollOffset: true
    }, data => {
        let width = data.width;
        let height = data.height;
        that.setData({
            width,
            height
        })
        setTimeout(() => {
            that.startDraw()
        }, 1500);
   }).exec()
},
startDraw() {
    let that = this
     
    // 创建wxml2canvas对象
    let drawMyImage = new wxml2canvas({
      element: 'canvas-map', // canvas的id,
      obj: that, // 传入当前组件的this
      width: that.data.width * 2,
      height: that.data.height * 2,
      background: '#141415', // 生成图片的背景色
      progress(percent) { // 进度
        // console.log(percent);
      },
      finish(url) { // 生成的图片
        wx.hideLoading()
        console.log(url)
        that.savePoster(url)
      },
      error(res) { // 失败原因
        console.log(res);
        wx.hideLoading()
      }
    }, this);
    let data = {
        // 获取wxml数据
        list: [{
            type: 'wxml',
            class: '.draw .draw1',  // draw要绘制的wxml元素根类名, draw1单个元素的类名(所有所有所有要绘制的单个元素都要添加该类名)
            limit: '.draw', // 要绘制的wxml元素根根根类名
            x: 0,
            y: 0
        }]
    }
    // 绘制canvas
    
    drawMyImage.draw(data, this)
},
savePoster() {
    const that = this
    wx.saveImageToPhotosAlbum({
        filePath: that.data.imgUrl,
        success: function() {
            wx.showToast({
                title: '保存成功',
                icon: 'none',
                duration: 1500
            });
        },
        fail(err) {
          if (err.errMsg === "saveImageToPhotosAlbum:fail:auth denied" || err.errMsg === "saveImageToPhotosAlbum:fail auth deny" || err.errMsg === "saveImageToPhotosAlbum:fail authorize no response") {
            wx.showModal({
              title: '提示',
              content: '需要您授权保存相册',
              showCancel: false,
              success: modalSuccess => {
                wx.openSetting({
                  success(settingdata) {
                    if (settingdata.authSetting['scope.writePhotosAlbum']) {
                        wx.saveImageToPhotosAlbum({
                            filePath: that.data.imgUrl,
                            success: function () {
                              wx.showToast({
                                title: '保存成功',
                                icon: 'success',
                                duration: 2000
                              })
                            },
                        })
                    } else {
                        wx.showToast({
                            title: '授权失败,请稍后重新获取',
                            icon: 'none',
                            duration: 1500
                        });
                    }
                  }
                })
              }
            })
          }
        }
      })
  },

还有 wxml-to-canvas(小程序官方) 等插件文章来源地址https://www.toymoban.com/news/detail-571238.html

到了这里,关于html2canvas(将dom元素转为canvas),wxml2canvas(微信小程序)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • html2canvas使用文档

    Install NPM Install Yarn 以 vue 举例,这样写起来比较方便 如果想要将图片导出,可以这样写 名称 默认值 描述 allowTaint false 是否允许跨源图像污染画布 backgroundColor #ffffff 画布背景色(如果在DOM中未指定),为透明设置null canvas null 用作绘图基础的现有画布元素 foreignObjectRendering

    2024年03月28日
    浏览(54)
  • html2canvas使用指南

      最近项目中需要使用到将网页中的内容下载成图片,通过按钮点击将页面保存下来,方便同事使用进行工作汇报。如图: 然后我想到了 html2canvas ,就可以解决我现在遇到的问题了。我火速从官网下载了js文件,这里附上链接:   http://html2canvas.hertzen.com/  这里   html2canvas

    2024年02月14日
    浏览(54)
  • html2canvas截图模糊问题

    最近项目中使用的html2canvas插件打印报表时,发现出现报表模糊的问题,而实际上是插件生成的图片中的像素发生了偏移。 后来查阅html2canvas源码中,发现了以下参数: 参数名称 默认值 描述 scale 1 按比例增加分辨率(2=双倍) dpi 96 将分辨率提高到特定的DPI(每英寸点数)

    2024年01月17日
    浏览(53)
  • vue前端实现将页面显示内容生成pdf文件的几种方法,html2canvas、dom-to-image、jspdf(带分页)基本使用以及介绍

    实际开发需求:vue项目中,根据数据结构生成echarts图表组件,生成带有样式的图表以后,点击下载按钮,把图表以pdf格式的文件下载到本地 实现思路:将vue界面的echarts组件生成图片,然后使用插件将生成的图片放入pdf中,再实现pdf文件的下载 涉及框架以及插件:vue、echar

    2024年01月25日
    浏览(48)
  • html2canvas截图生产海报图片

    图片地址后添加?time=${new Date().valueOf()},不然会报图片跨域报错 原因:这是因为你img是在缓存数据中读取的 并没有访问远程这个图片的时候没有携带请求头。 确保你的图片服务器支持CORS访问,也就是会返回Access-Control-Allow-Origin等响应头;

    2024年02月02日
    浏览(48)
  • html2Canvas常见问题以及解决

    近期开发在vue中引用了html2Canvas后,使用时遇到一些常见问题,简单总结下: 简单代码使用格式: 阐述:生成图片后,图片下载通过添加a标签,添加download属性进行图片下载 但是在微信开发里面失效了,理由很简单,微信环境下不兼容download属性,解决办法,图片可以通过长

    2024年02月04日
    浏览(63)
  • 小程序采用html2canvas实现html转canvas保存图片

    mpaas小程序中采用html2canvas实现html转canvas保存图片 使用uniapp将代码打包一份h5部署到服务器 h5要保存的图片组件页面report.vue 安装 npm install --save html2canvas 或 yarn add html2canvas 引入import html2canvas from ‘html2canvas’; ts 小程序中采用webview跳转到h5页面

    2024年02月11日
    浏览(44)
  • vue2 -- 截图工具html2canvas

    可以将网页中的指定元素或整个页面截取为图片,以便保存或分享。 在 Vue 中使用 html2canvas 实现 1:安装 html2canvas 库。你可以使用 npm 安装,命令如下: 2:在需要使用 html2canvas 的 Vue 组件中,引入 html2canvas 库: :3:编写截图逻辑。你可以在组件的方法中编写,例如:

    2024年01月19日
    浏览(49)
  • 解决前端html2canvas生成图片慢问题

    分享一个小发现 这里首先直接说结论:         由于html2canvas生成图片的过程会从html的head、body层标签开始遍历,所以对于项目较大,但是只需要对 某个dom (下文以D称呼)生成图片的情况非常不友好!          所以,一定要通过ignoreElements过滤掉大部分没用的标签。

    2024年02月13日
    浏览(56)
  • vue使用html2canvas优化---节点过滤

    当你使用html2canvas对某个节点进行截图时,项目小dom节点少那还没什么性能问题,如果是个大项目,有成百上千个dom节点,那将是非常头疼的事情(产品经理:小张啊,你这个截图功能为什么需要这个长的时间,这让客户怎么用,重新改。小张:********...)。不多bb了,直接开

    2024年02月12日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包