uni-app使用html2canvas
<p>uni-app html2canvas在web端兼容性挺好的,但是对于app来说就不太行</p><p>uni-app App是vue页面,无法获取window对象,所以我们就需要配合render.js来完成canvas的绘制</p>
<p>人为触发比如点击按钮实现起来很方便,但是有时候我们需要进来就执行绘制的方法,那么就需要如下操作:</p>
<p> </p>
<p>在开发过程中我们将HTML2canvas封装成一个组件,通过prop传递ID参数</p>
<p>在组件中,通过prop接收ID的,ID的变化来触发render.js里面的函数</p>
<p>html2canvas.vue:</p>
<p> </p>
<div class="cnblogs_code">
<div class="cnblogs_code">
<pre><template>
<view>
<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>>
<slot></slot>
</view>
</view>
</template>
<script><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></script>
<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>><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> ()=><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></script>
<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>>
</style></pre>
</div>
<p> </p>
</div>
<p>index.vue:</p>
<p>index页面直接获取生成后的数据</p>
<div class="cnblogs_code">
<pre></pre>
<div class="cnblogs_code">
<pre><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>>
<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>>
<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>>
<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>>
<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> />
</view>
</view>
<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>>{{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>)}}</view>
<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>>{{userInfo.code}}</view>
</view>
</html2canvas></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> </p><br><br>
来源:https://www.cnblogs.com/aotuboke/p/14523789.html
頁:
[1]