当前位置:   article > 正文

uni-app 微信小程序 图文生成图片 wxml-to-canvas_uniapp wxml-to-canvas

uniapp wxml-to-canvas

在做的小程序要增加一个将文字与图片生成图片不可修改的功能,第一次做,在网上找了不少资料。参考了wxml-to-canvas | 微信开放文档  ,又看了一些相关事例,尝试写了一下。
 

需要准备的文件及配置项:

1、先把代码片段下载到本地

2、创建wxcomponents目录,把代码片段中的文件拷到此目录下,并将下图的目录改成真实目录。

3、修改配置文件pages.json,找到要写此功能的路径,加上

"style": {
                "app-plus": {
                    "titleNView": false //禁用原生导航栏
                },
                "navigationBarTitleText": "",
                "enablePullDownRefresh": false,
                "navigationStyle": "custom",
                "usingComponents":{
                    "wxml-to-canvas": "/wxcomponents/wxml-to-canvas/index"
                }
            }

 

 4、开始写组件。注意this.widget = this.selectComponent('.widget');一定要放在onLoad页面生命周期中,不然不生效

 <view :style="{width: canvasWidth + 'px', height: canvasHeight + 'px' }">
        <wxml-to-canvas class="widget" :width="canvasWidth" :height="canvasHeight"></wxml-to-canvas>
    </view>

  1. const {
  2.         wxml,
  3.         style
  4.     } = require('./notification.js')
  5.     export default {
  6.         data() {
  7.             return {
  8.                 imgSrc: '/static/img/3.png',
  9.                 //最后生成的图片信息
  10.                 imageData: null,
  11.                 canvasWidth: 320, // 默认canvas宽高
  12.                 canvasHeight: 480,
  13.                 screenWidth: null, // 设备宽度
  14.                 screenHeight: null, // 设备宽度
  15.                 userInfo: {},
  16.                 isRegister: '',
  17.                 controlContent: undefined,
  18.                 statusCode: undefined,
  19.                 //上个页面用到的图片地址
  20.                 tempFile:undefined
  21.             }
  22.         },
  23.         onLoad(option) {
  24.             this.userInfo = uni.getStorageSync('weixin-userInfo') ? JSON.parse(uni.getStorageSync('weixin-userInfo')) :{};
  25.             // 获取设备信息
  26.             wx.getSystemInfo({
  27.                 success: (res) => {
  28.                     this.screenWidth = res.screenWidth
  29.                     this.screenHeight = 800 //高度建议计算得出或写死。如使用res.screenHeight,文字过长时无法生成(安卓手机,最新鸿蒙系统高度不能超过1000
  30.                     this.canvasWidth = this.screenWidth
  31.                     this.canvasHeight = this.screenHeight
  32.                     setTimeout(() => {
  33.                         this.widget = this.selectComponent('.widget');
  34.                         this.controlContent = option.controlContent;
  35.                         this.tempFile = option.tempFile
  36.                         this.download();
  37.                     }, 1000)
  38.                 }
  39.             });
  40.         },
  41.         methods: {
  42.             //生成图片
  43.             download() {
  44.                 // 数字容器宽度 动态设置 
  45.                 setTimeout(() => {
  46.                     uni.showLoading({
  47.                         title: '图片生成中...'
  48.                     })
  49.                     this.renderToCanvas()
  50.                 }, 1000)
  51.             },
  52.             renderToCanvas() {
  53.                 const _wxml = wxml('test', this.tempFile, this.controlContent) //调用wxml
  54.                 const _style = style(this.screenWidth, this.canvasWidth, this.canvasHeight)
  55.                 setTimeout(() => {
  56.                     const p1 = this.widget.renderToCanvas({
  57.                         wxml: _wxml,
  58.                         style: _style
  59.                     })
  60.                     p1.then((res) => {
  61.                         uni.hideLoading()
  62.                         this.saveImageToPhotosAlbum();
  63.                     }).catch((err) => {
  64.                         console.log('生成失败')
  65.                     })
  66.                 }, 100)
  67.             },
  68.            //保存图片到本地
  69. saveImageToPhotosAlbum() {
  70. uni.showLoading({
  71. title: '正在保存中...'
  72. })
  73. const p2 = this.widget.canvasToTempFilePath()
  74. let that = this
  75. p2.then(result => {
  76. let path = result.tempFilePath
  77. uni.uploadFile({
  78. url: '上传服务地址',
  79. filePath: path,
  80. name: 'file',
  81. formData: {
  82. 'user': 'test'
  83. },
  84. success: (res) => {
  85. let data = JSON.parse(res.data)
  86. if (data.code == 200) {
  87. uni.saveImageToPhotosAlbum({
  88. filePath: path,
  89. success: () => {
  90. uni.hideLoading()
  91. uni.showToast({
  92. title: '保存成功,可去手机相册查看',
  93. duration: 2000,
  94. icon: 'none'
  95. });
  96. /* uni.redirectTo({
  97. url: '../communityControl/notification?tempFile='+ this.tempFile
  98. }); */
  99. uni.navigateBack();
  100. }
  101. });
  102. }
  103. }
  104. });
  105. })
  106. }
  107.         }
  108.     }

 5、写notification.js文件,必须要按照wxml-to-canvas写生成模板,不然不生效

  1. const wxml = (name, pic, content) => `
  2. <view class="container">
  3. <text class="content">` + content + `</text>
  4. <image src="` + pic + `" class="pic"/>
  5. </view>
  6. `
  7. /**
  8. * @param {*} screenWidth 屏幕宽度
  9. * @param {*} canvasWidth 画布宽度
  10. * @param {*} canvasHeight 画布高度
  11. * @param {*} numberWidth 数字宽度,动态设置
  12. * @return {*}
  13. */
  14. const style = (screenWidth, canvasWidth, canvasHeight) => {
  15. return {
  16. "container": {
  17. width: canvasWidth,
  18. height: canvasHeight,
  19. position: 'relative',
  20. overflow: 'hidden',
  21. backgroundColor: '#ffffff',
  22. padding: '30rpx 20rpx',
  23. },
  24. "name": {
  25. fontSize: 20,
  26. color: '#333',
  27. marginLeft: canvasWidth * 0.08,
  28. width: canvasWidth * 0.84,
  29. height: screenWidth * 0.18,
  30. textAlign: 'center',
  31. },
  32. "content": {
  33. fontSize: 14,
  34. color: '#333',
  35. width: canvasWidth * 0.84,
  36. height: screenWidth * 0.84,
  37. marginLeft: canvasWidth * 0.08,
  38. marginTop: canvasWidth * 0.08,
  39. },
  40. "pic": {
  41. width: canvasWidth * 0.4,
  42. height: screenWidth * 0.2,
  43. marginTop: canvasWidth * 0.1,
  44. marginLeft: canvasWidth * 0.35,
  45. marginBottom: canvasWidth * 0.05,
  46. borderRadius: screenWidth * 0.14,
  47. overflow: 'hidden',
  48. },
  49. }
  50. }
  51. module.exports = {
  52. wxml,
  53. style
  54. }

本文档适用于vue2,并正式运用到项目中,但本人未在vue3的环境下使用,有友友提醒说不能用在vue3中,特在此说明,也欢迎使用的友友们提出宝贵意见。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/584937
推荐阅读
相关标签
  

闽ICP备14008679号