大肥肥的小肥肥 發表於 2021-3-12 14:38:00

uni-app使用html2canvas

<p>uni-app&nbsp;html2canvas在web端兼容性挺好的,但是对于app来说就不太行</p>
<p>uni-app App是vue页面,无法获取window对象,所以我们就需要配合render.js来完成canvas的绘制</p>
<p>人为触发比如点击按钮实现起来很方便,但是有时候我们需要进来就执行绘制的方法,那么就需要如下操作:</p>
<p>&nbsp;</p>
<p>在开发过程中我们将HTML2canvas封装成一个组件,通过prop传递ID参数</p>
<p>在组件中,通过prop接收ID的,ID的变化来触发render.js里面的函数</p>
<p>html2canvas.vue:</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<div class="cnblogs_code">
<pre>&lt;template&gt;
    &lt;view&gt;
      &lt;view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">html2canvas</span><span style="color: rgba(128, 0, 0, 1)">"</span> :prop=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">domId</span><span style="color: rgba(128, 0, 0, 1)">"</span> :change:prop=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">html2canvas.create</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
            &lt;slot&gt;&lt;/slot&gt;
      &lt;/view&gt;
    &lt;/view&gt;
&lt;/template&gt;

&lt;script&gt;<span style="color: rgba(0, 0, 0, 1)">
    import { base64ToPath } </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">@/utils/image-tools.js</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
    export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
      name: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">html2canvas</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
      props: {
            domId: {
                type: String,
                required: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
            }
      },
      methods: {
            </span><span style="color: rgba(0, 0, 255, 1)">async</span><span style="color: rgba(0, 0, 0, 1)"> renderFinish(base64) {
                </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">{
                  </span><span style="color: rgba(0, 0, 255, 1)">const</span> imgPath = <span style="color: rgba(0, 0, 255, 1)">await</span> base64ToPath(base64, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">.jpeg</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
                  console.log(imgPath)
                  </span><span style="color: rgba(0, 0, 255, 1)">this</span>.$emit(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">renderFinish</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, imgPath);
                }</span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)">(e){
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">TODO handle the exception</span>
                  console.log(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">html2canvas error</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, e)
                }
            },
            showLoading() {
                uni.showLoading()
            },
            hideLoading() {
                uni.hideLoading();
            }
      }
    }
</span>&lt;/script&gt;

&lt;script module=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">html2canvas</span><span style="color: rgba(128, 0, 0, 1)">"</span> lang=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">renderjs</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;<span style="color: rgba(0, 0, 0, 1)">
import html2canvas </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">html2canvas</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
    methods: {
      </span><span style="color: rgba(0, 0, 255, 1)">async</span><span style="color: rgba(0, 0, 0, 1)"> create(domId) {
            </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">const</span> timeout = setTimeout(<span style="color: rgba(0, 0, 255, 1)">async</span> ()=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                  </span><span style="color: rgba(0, 0, 255, 1)">const</span> shareContent =<span style="color: rgba(0, 0, 0, 1)"> document.querySelector(domId);
                  </span><span style="color: rgba(0, 0, 255, 1)">const</span> canvas = <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> html2canvas(shareContent,{
                        width: shareContent.offsetWidth,</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置canvas尺寸与所截图尺寸相同,防止白边</span>
                        height: shareContent.offsetHeight,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">防止白边</span>
                        logging: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
                        useCORS: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
                  });
                  </span><span style="color: rgba(0, 0, 255, 1)">const</span> base64 = canvas.toDataURL(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">image/jpeg</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
                  </span><span style="color: rgba(0, 0, 255, 1)">this</span>.$ownerInstance.callMethod(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">renderFinish</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">, base64);
                  clearTimeout(timeout);
                }, </span><span style="color: rgba(128, 0, 128, 1)">500</span><span style="color: rgba(0, 0, 0, 1)">);
            } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)">(error){
                console.log(error)
            }
      }
    }
}
</span>&lt;/script&gt;


&lt;style lang=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">scss</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;

&lt;/style&gt;</pre>
</div>
<p>&nbsp;</p>
</div>
<p>index.vue:</p>
<p>index页面直接获取生成后的数据</p>
<div class="cnblogs_code">
<pre></pre>
<div class="cnblogs_code">
<pre>&lt;html2canvas <span style="color: rgba(0, 0, 255, 1)">ref</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">html2canvas</span><span style="color: rgba(128, 0, 0, 1)">"</span> :domId=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">domId</span><span style="color: rgba(128, 0, 0, 1)">"</span> @renderFinish=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">renderFinish</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
                &lt;view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">invite-image</span><span style="color: rgba(128, 0, 0, 1)">"</span> id=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">poster</span><span style="color: rgba(128, 0, 0, 1)">"</span> :<span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">i18n.locale=='en'?'en':'zh'</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
                  &lt;view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">code-image</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
                        &lt;view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">qrimg</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
                           &lt;tki-<span style="color: rgba(0, 0, 0, 1)">qrcode
                            </span><span style="color: rgba(0, 0, 255, 1)">ref</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">qrcode</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
                            :cid</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">cid</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
                            :val</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dowaload</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
                            :size</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">size</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
                            :unit</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">unit</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
                            :onval</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">onval</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
                            foreground</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">#000000</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
                            pdground</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">#000000</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
                            :loadMake</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">loadMake</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
                            :loadingText</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">i18n.t('base.textLoading')</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
                            @result</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">qrR</span><span style="color: rgba(128, 0, 0, 1)">"</span> /&gt;
                        &lt;/view&gt;
                  &lt;/view&gt;
                  &lt;view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">invite-text</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;{{i18n.t(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">user.invite.inviteCode</span><span style="color: rgba(128, 0, 0, 1)">'</span>)}}&lt;/view&gt;
                  &lt;view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">invite-code</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;{{userInfo.code}}&lt;/view&gt;
                &lt;/view&gt;
      &lt;/html2canvas&gt;</pre>
</div>
<pre></pre>
<p>中间是二维码部分可以忽略,从而就可以实现海报的绘制,保存的时候重复的照片只会保存一张,有时候可能会失败,就要返回重新进入再次保存</p>
<p>IOS可能存在错误,由于时间有限,没来得及研究,就只看了安卓的,后面有机会再研究,要是谁做出来了,也欢迎分享!</p>
<pre><span style="color: rgba(0, 128, 0, 1)"><br>/*</span><span style="color: rgba(0, 128, 0, 1)">*
             * 渲染完毕接收图片
             * @param {String} filePath
             </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
            renderFinish(filePath) {
                console.log(filePath);
                </span><span style="color: rgba(0, 0, 255, 1)">this</span>.filePath =<span style="color: rgba(0, 0, 0, 1)"> filePath;
                that.btnShow</span>=<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
                console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">filePath</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, filePath)
            },</span></pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/aotuboke/p/14523789.html
頁: [1]
查看完整版本: uni-app使用html2canvas