草庐IT

wxml2canvas 小程序元素生成图片

夏子涵呀呀呀 2023-10-27 原文

1、下载

小程序内部要安装wxml2canvas
github地址:https://github.com/liudongyun1215/wxml2canvas

1.1、初始化package.json, 下面两种代码都可以初始化package.json

npm init
yarn init

1.2、安装wxml2canvas

yarn add wxml2canvas
npm i wxml2canvas

1.3、构建npm

2、使用

2.1、在js页面引入

import Wxml2Canvas from 'wxml2canvas'; 

2.2、在js中使用, 需要在使用的方法中引用drawCanvas

drawCanvas: function () {
        wx.showLoading({
           title: '加载中'
        })
        const that = this
        const query = wx.createSelectorQuery().in(this);
        query.select('#answer-canvas').fields({ //answer-canvas要绘制的canvas的id
            size: true,
            scrollOffset: true
        }, data => {
            let width = data.width;
            let height = data.height;
            console.log(width, height);
            that.setData({
                width: width,
                height: height
            })
            setTimeout(() => {
                that.draw()
            }, 1500);
       }).exec()
    },
    draw(){
        let that = this
        
        //创建wxml2canvas对象
        let drawImage = new Wxml2Canvas({
          element: 'answerCanvas', // canvas节点的id,
          obj: that, // 在组件中使用时,需要传入当前组件的this
          width: 696, // 宽 自定义
          height: 522, // 高 自定义
          background: 'transparent', // 默认背景色 设置背景色
          progress(percent) { // 绘制进度
            // console.log(percent);
          },
          finish(url) {
            console.log("创建的图片", url);
            wx.hideLoading()
            that.setData({
                imgUrl: url
            })
          },
          error(res) {
            console.log(res);
            // uni.hideLoading()
            // 画失败的原因
          }
        }, this);
        let data = {
          //直接获取wxml数据
          list: [{
              type: 'wxml',
              class: '.answer_canvas .answer_draw_canvas',  // answer_canvas这边为要绘制的wxml元素跟元素类名, answer_draw_canvas要绘制的元素的类名(所有要绘制的元素都要添加该类名)
              limit: '.answer_canvas', // 这边为要绘制的wxml元素跟元素类名,最外面的元素
              x: 0,
              y: 0
            } ]
        }
          //传入数据,画制canvas图片
        drawImage.draw(data, this);
    }

2.3、xwml中添加元素

canvas元素添加

<canvas canvas-id="answerCanvas" class="answerCanvas"></canvas>

生成后的图片展示

<image class="canvas_img" src="{{imgUrl}}" wx:if="{{imgUrl}}" show-menu-by-longpress="{{true}}"></image>

要生成图片的html元素

 <view class="canvasImg answer_canvas " id="answer-canvas" wx:if="{{!imgUrl}}">
            <view class="inner answer_draw_canvas"  data-type="background-image">
                <image class="left_icon answer_draw_canvas" src="/images/htsi/left_icon.png" data-type="image" data-url="/images/htsi/left_icon.png"></image>
                <view class="name answer_draw_canvas" data-type="text" data-text="姓名:XXX">姓名:XXX</view>
                <view class="desc answer_draw_canvas" data-type="text" data-text="这边是要绘制的文字">这边是要绘制的文字</view>
                <view class="desc answer_draw_canvas" data-type="text" data-text="要绘制的文字描述">要绘制的文字描述</view>
                <view class="bottom answer_draw_canvas">
                    <image src="https://img0.baidu.com/it/u=753216696,2669208484&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1657299600&t=c358bbe8685325dfa573277881d24cea" alt="" class="mini answer_draw_canvas" data-type="image" data-url='https://img0.baidu.com/it/u=753216696,2669208484&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1657299600&t=c358bbe8685325dfa573277881d24cea'/>
                    <view class="left answer_draw_canvas">
                        <text class="company answer_draw_canvas" data-type="text" data-text="要绘制的文字">要绘制的文字</text>
                        <text class="time answer_draw_canvas" data-type="text" data-text="2022年03月05日">20220305</text>
                    </view>
                </view>
            </view>
           
        </view>

3、要添加元素的格式

3.1、背景图片

元素要添加背景图片的时候需要添加data-type=“background-image”

<view class="inner answer_draw_canvas"  data-type="background-image"></view>

3.2、图片

元素要是image的时候要添加data-type=“image” data-url=‘图片地址’, 这边图片地址要在小程序配置白名单,背景图片同下

3.3、文字绘制

文字绘制需要添加data-type=“text” data-text=“要绘制的文字”

<text class="time answer_draw_canvas" data-type="text" data-text="要绘制的文字">要绘制的文字</text>

4、遇到的问题

4.1、边框不展示

要看一下是否设置了box-sizing: border-box;如果css设置了该属性会导致边框不出现

4.2、图片

图片本地的正常引用,如果是链接的一定要保证配置白名单,详情见3.2,否则生成会一直加载中

有关wxml2canvas 小程序元素生成图片的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  3. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  4. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  5. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  6. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  7. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  8. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  9. ruby - 在哈希的键数组中追加元素 - 2

    查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

  10. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

随机推荐