自己做了一个小程序,主要用于给头像加图标的那种,和qq似的,主要用canvas做的, 第一回用,掉了很多坑,所以今天总结一下自己所做的,如果大家有不理解的地方,欢迎提问;如果帮到大家的话,帮忙点个啥的

canvas可以用来画一些东西,前台生成一些海报什么的,可以保存base64图片

canvas中介绍的各种方法有很多参数,不理解的话请自行到小程序开发文档查看

我合成的方法是,第一步:获取系统信息,第二步:画背景,第三步:在这个背景上画另外一张图片,进行合成,然后转base64图片,传给后台

##你在画布,想把一张图片画上去,只要是网络图片,就一定要download file下来,使用临时路径,因为我就踩了这个大坑,直接使用网络图片,会有真机不显示的问题

##因为你头像也需要使用缓存路径,所有你需要把https://wx.qlogo.cn添加到你的downloadfile的域名下,这样就省事了很多,如果你想要测试,就把详情里的不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书,对勾去掉测试,为了实现效果不择手段

第一步:获取系统信息:

  1. 1//获取系统信息。手机型号,设备像素比,屏幕宽高,可使用窗口宽高,微信app的信息
  2. getSystemInfo: function () {
  3. var t = this;
  4. wx.getSystemInfo({
  5. success: function (a) {
  6. //screenWidth,screenHeight屏幕宽高
  7. var i = a.screenWidth / 375;
  8. t.setData({
  9. screenWidth: i,
  10. canvasWidth: a.screenWidth / 375 * 250,
  11. canvasHeight: a.screenWidth / 375 * 250
  12. }), e.globalData.platform = a.platform;
  13. }
  14. })
  15. },

第二步:绘制背景

  1. //需要获取canvas,和h5一样
  2. const ctx = wx.createCanvasContext('myCanvas')
  3. draw: function (path) {
  4. console.log(path)
  5. var that = this
  6. //背景图片路径
  7. var path = path
  8. //画布宽度 //画布高度
  9. var canvasWidth = that.data.canvasWidth
  10. var canvasHeight = that.data.canvasHeight
  11. //getImageInfo()获取图片信息,倘若为网络图片,需先配置download域名才能生效。
  12. wx.getImageInfo({
  13. src: path,
  14. success: function (res) {
  15. //drawImage()绘制图像到画布。
  16. //res.path所要绘制的图片资源
  17. //0,0,是你要在画布的哪个位置开始画
  18. //canvasWidth, canvasHeight你需要在画布上绘制多大的背景图,允许缩放
  19. ctx.drawImage(res.path, 0, 0, canvasWidth, canvasHeight)
  20. //画完第一层背景之后,调用合成图标的方法
  21. that.headicon()
  22. },
  23. fail: function (res) {
  24. console.log(res);
  25. }
  26. })
  27. },

第三步:画好背景,合成图标,图片做好后,我利用canvasGetImageData()方法,把画布内容保存成base64的图片,如果有想用此方法的需要三个文件,我把它放在网盘,大家可以下载

链接:https://pan.baidu.com/s/1bHXpAGDdPkmQpgLt49wUGQ 密码:6riy

const base64 = require('../../utils/base64.js')
const upng = require('../../utils/UPNG.js')
  1. headicon: function () {
  2. var that = this
  3. //图标路径
  4. var qrcodeUrl = this.data.qrcodeUrl;
  5. //画布宽度 //画布高度
  6. var canvasWidth = this.data.canvasWidth
  7. var canvasHeight = this.data.canvasHeight
  8. // 你需要把图标绘制到哪个位置(起点位置)
  9. var x = canvasWidth - 80
  10. var y = canvasHeight - 80
  11. wx.getImageInfo({
  12. src: qrcodeUrl,
  13. success: function (res) {
  14. ctx.drawImage(qrcodeUrl, x, y, 80, 80)
  15. //保存当前画的状态
  16. ctx.save();
  17. //恢复当前画的状态
  18. ctx.restore();
  19. ctx.draw(false, () => {
  20. // 2. 获取图像数据。canvasGetImageData()在ctx.draw()里使用在有效
  21. wx.canvasGetImageData({
  22. // 你需要获取那张画布的数据,获取多大范围的数据
  23. canvasId: "myCanvas",
  24. x: 0,
  25. y: 0,
  26. width: canvasWidth,
  27. height: canvasHeight,
  28. success:res=> {
  29. // 3. png编码
  30. let pngData = upng.encode([res.data.buffer], res.width, res.height)
  31. // 4. base64编码,转成base64图片,就可以发送给后台保存了
  32. let base64 = wx.arrayBufferToBase64(pngData)
  33. that.setData({
  34. generatePictures: base64
  35. })
  36. }
  37. })
  38. })
  39. },
  40. fail: function (res) {
  41. console.log(res);
  42. }
  43. })
  44. },

  

2小程序canvas使用,及一些坑,以及自己的一些小总结的更多相关文章

  1. 原创:WeZRender:微信小程序Canvas增强组件

    WeZRender是一个微信小程序Canvas增强组件,基于HTML5 Canvas类库ZRender. 使用 WXML: <canvas style="width: 375px; h ...

  2. 记录一下小程序canvas

    小程序canvas学习 效果图: .wxml <canvas style="width: 100vw; height: 100vh;" canvas-id="fir ...

  3. 微信小程序-canvas绘制文字实现自动换行

    在使用微信小程序canvas绘制文字时,时常会遇到这样的问题:因为canvasContext.fillText参数为 我们只能设置文本的最大宽度,这就产生一定的了问题.如果我们绘制的文本长度不确定或者 ...

  4. 微信小程序 canvas 字体自动换行(支持换行符)

    微信小程序 canvas 自动适配 自动换行,保存图片分享到朋友圈  https://github.com/richard1015/News 微信IDE演示代码https://developers.w ...

  5. 微信小程序--canvas画布实现图片的编辑

    技术:微信小程序   概述 上传图片,编辑图片大小,添加文字,改变文字颜色等 详细 代码下载:http://www.demodashi.com/demo/14789.html 概述 微信小程序--ca ...

  6. 小程序canvas生成海报保存至手机相册

    小程序canvas画图保存至手机相册 (1)可直接展示生成的海报 .因手机分辨率不同可能导致生成的海报会有细微差别,这里隐藏canvas海报,页面正常设置海报样式保存时保存隐藏的canvas海报 (2 ...

  7. 优化版小程序canvas,增加失败逻辑,及完善文字

    wxml <view class="shareBox" style="backgound:{{isShow ? '#000' : '#fff'}}" wx ...

  8. 总结微信小程序开发中遇到的坑

    总结微信小程序开发中遇到的坑,一些坑你得一个一个的跳啊,/(ㄒoㄒ)/~~ 1,页面跳转和参数传递实例 首先说一下我遇到的需求有一个我的消息页面,里面的数据都是后端返回的,返回的数据大致如下,有一个是 ...

  9. 小程序——微信小程序初学踩过的坑

    微信小程序初学踩过的坑 一.前言     最近因为某些需要和个人兴趣打算开发一下微信小程序,经过在官方网站上的基本了解,我大体知道了微信小程序开发的大致过程,其实最本质的就是MVVM,借用了很多模式上 ...

  10. 微信小程序 | canvas绘图

    1.新的尺寸单位 rpx rpx(responsive pixel): 可以根据屏幕宽度进行自适应. 规定屏幕宽为750rpx.如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则 ...

随机推荐

  1. Vue.js 2.x笔记:基本语法(2)

    1. Vue实例及选项 1.1 创建Vue实例(new Vue instance) 每个Vue Application必须创建一个root Vue Instance. <script> v ...

  2. 台达PLC实现远程下载程序

    台达PLC实现远程下载程序 日期:2019-04-27                    时间    08:33:57 让物联变得更简单 18-09-2411:25 明明在公司调试没问题的设备一到 ...

  3. Lua中ipairs和pairs的区别详解

    迭代器for遍历table时,ipairs和pairs的区别: 区别一:ipairs遇到nil会停止,pairs会输出nil值然后继续下去 区别二: , b = , x = , y = , " ...

  4. 关于TVWALL 通过AS300获取状态连接失败

    昨天晚会突然之间频繁出现tvwall视频软件,断开AS300管理软件的故障 发现AS300当中的cms服务进程,占用内存250M左右,一般情况下估计就是50M左右,增长了不少 无奈之下,只有重启AS3 ...

  5. Python实现FTP文件的上传和下载

    # coding: utf-8 import os from ftplib import FTP def ftp_connect(host, username, password): ftp = FT ...

  6. Djagno从入门到放弃

    一.web应用.http协议.web框架 二.Django简介 三.路由控制 四.视图层 五.模版层 六.模型层:单表操作,多表操作,常用字段和参数,Django-model进阶 七.组件:Djang ...

  7. 一、docker的原理

    一.docker解决什么问题: 高效的利用资源 应用之间相互隔离 应用之间不能发生资源抢占,每个应用只能使用事先注册申请的资源. 环境封装,利于迁移 二.docker的原理: 1.Namespaces ...

  8. 【持续跟新】剑指Offer_Java实现

    [第一题 ]二维数组中的查找 package sword_finger_offer; import org.junit.jupiter.api.Test; /** * 剑指offer习题一 二维数组中 ...

  9. SQL两个事务update同一张表出现的死锁问题(waitfor delay)

    抄录网址:https://blog.csdn.net/qiumuxia0921/article/details/50574879 下面是我们的建表语句: SET ANSI_NULLS ON GO SE ...

  10. ORM系列之Entity FrameWork详解

    一. 谈情怀 从第一次接触开发到现在(2018年),大约有六年时间了,最初阶段连接数据库,使用的是[SQL语句+ADO.NET],那时候,什么存储过程.什么事务 统统不理解,生硬的将SQL语句传入SQ ...