前言

这几天接到一个需求,要在公众号内生成分享海报。之前有做过H5和小程序的,心想直接复制过来就行了。没想到踩了不少的坑,搞了好几天终于搞好了,特此分享一下,希望能对大家有所帮助。

效果图

代码实现

    <u-mask :show="showPoster" @click="showPoster = false" :custom-style="{background: 'rgba(0, 0, 0, 0.8)'}">
<view class="poster-canvas">
<canvas canvas-id="canvasId"
:style="{width: (poster.width||10) + 'px', height: (poster.height||10) + 'px'}"></canvas>
</view>
<view class="poster-img-box">
<image class="poster-img" :src="posterUrl" show-menu-by-longpress></image>
</view>
<view class="poster-footer">
长按图片保存
</view>
</u-mask>
import {
getSharePoster
} from '@/components/QuShe-SharerPoster/QS-SharePoster/QS-SharePoster.js';
data() {
return {
showPoster: false,
posterUrl: "",
posterCodeUrl: "",
avatarUrl: "",
bgUrl: "",
poster: {},
}
},
async createPoster() {
let _this = this; const d = await getSharePoster({ //return Promise
_this: _this, //若在组件中使用 必传
posterCanvasId: 'canvasId', //canvasId
canvasType: '2d',
type: 'testShareType',
backgroundImage: `data:image/png;base64,${this.info.background_url2}`, //背景图片路径, 画布会跟随图片的实际像素, 并绘制为背景, 请不要使背景图片的像素太大
setCanvasWH({
bgObj
}) {
bgObj.width = 245
bgObj.height = 435
_this.poster = bgObj
},
drawArray({ //绘制序列
bgObj, //背景图对象
type, //自定义标识
bgScale, //背景缩放
setBgObj, //动态设置画布(宽高),若使用该方法不建议背景图方式绘制, 建议使用background自定义画布绘制, 因为这个方法绘制修改背景图的宽高
getBgObj //获取动态设置的画布宽高
}) {
//return new Promise((rs, rj)=>{ rs([Obejct, ...]) })
//或者
//return [Obejct, ...]
const elementArray = [{
type: 'image',
id: 'code',
url: `data:image/png;base64,${_this.posterCodeUrl}`,
dx: 170,
dy: 350,
dWidth: 60,
dHeight: 60,
serialNum: 0,
}]
if (_this.info.background_if_avatar) {
elementArray.push({
type: 'image',
id: 'avatar',
url: `data:image/png;base64,${_this.info.image2}`,
dx: 20,
dy: 355,
dWidth: 32,
dHeight: 32,
serialNum: 0,
circleSet: {
r: 16
}
}, )
}
if (_this.info.background_if_nickname) {
elementArray.push({
type: 'text',
id: 'nickname',
text: _this.nickName,
color: '#fff',
dx: 20,
dy: 400,
serialNum: 1,
})
}
return elementArray
},
})
uni.hideLoading()
this.showPoster = true
this.posterUrl = d.poster.tempFilePath
},

以上是具体实现的主要代码,这里选用了QS-SharePoster插件,开始时我是想用uniapp的原生canvas-API进行开发的,可是总是有各种各样的问题,搞了一天不得已只能放弃。

请注意在公众号内图片一定要用base64格式的!在使用uniapp并且公众号内生成海报是需要使用到图片下载API的,这个API总是会莫名其妙的失败,找不到任何的原因。小程序端以及H5都是完全正常的。尝试了好几天无果后,突然想到是不是可以采用base64格式的图片是不是没有限制呢?毕竟base64相当于直接就是数据了,试了一下果然可以,问题也解决了。

最新文章

  1. 通知 Notification
  2. Div 自适应屏幕大小
  3. 关于Git中的一些常用的命令
  4. 关于NetworkInfo对象的isConnected()与isAvailable()
  5. FindControl的使用方法
  6. Chrome调试nodejs
  7. 调用Android系统设置中的Intent
  8. http status 400,http 400,400 错误
  9. hash实现锚点平滑滚动定位
  10. EasyUI datagrid 删除的时候无法正确找到重复记录row index的问题
  11. echarts堆叠图展示,根据数据维度的粒度判断是否展示数据
  12. python 读取本地文件批量插入mysql
  13. 深入解析浏览器的幕后工作原理(三) 呈现树和 DOM 树的关系
  14. 安全框架Shiro
  15. 数据库MySQL(课下作业)
  16. Windows多线程中关键段(Critical Section)的应用
  17. SVN客户端操作
  18. C# 对轻量级(IoC Container)依赖注入Unity的使用
  19. IntelliJ IDEA 激活 及 License Server 安装使用 Window篇
  20. Linux下HBase和Maven的环境搭建

热门文章

  1. Zookeeper的选举机制和同步机制超详细讲解,面试经常问到!
  2. BIBD&amp;SBIBD的矩阵题
  3. 2021.1.23--vj补题
  4. perl打开读取文件(open)
  5. STM32中操作寄存器GPIOB_CRL &amp;= ~( 0x0F&lt;&lt; (4*0))与GPIOB_CRL &amp;=~(0x0F)之间有什么区别吗?
  6. mil,mm与inch之间的转换
  7. 三极管和MOS管驱动电路的正确用法
  8. 攻防世界 杂项 3.神奇的Modbus
  9. Spring Boot 2.5.0 重新设计的spring.sql.init 配置有何用?
  10. 2021CCPC网络赛(重赛)题解