2小程序canvas使用,及一些坑,以及自己的一些小总结
自己做了一个小程序,主要用于给头像加图标的那种,和qq似的,主要用canvas做的, 第一回用,掉了很多坑,所以今天总结一下自己所做的,如果大家有不理解的地方,欢迎提问;如果帮到大家的话,帮忙点个啥的
canvas可以用来画一些东西,前台生成一些海报什么的,可以保存base64图片
canvas中介绍的各种方法有很多参数,不理解的话请自行到小程序开发文档查看
我合成的方法是,第一步:获取系统信息,第二步:画背景,第三步:在这个背景上画另外一张图片,进行合成,然后转base64图片,传给后台
##你在画布,想把一张图片画上去,只要是网络图片,就一定要download file下来,使用临时路径,因为我就踩了这个大坑,直接使用网络图片,会有真机不显示的问题
##因为你头像也需要使用缓存路径,所有你需要把https://wx.qlogo.cn添加到你的downloadfile的域名下,这样就省事了很多,如果你想要测试,就把详情里的不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书,对勾去掉测试,为了实现效果不择手段
第一步:获取系统信息:
1://获取系统信息。手机型号,设备像素比,屏幕宽高,可使用窗口宽高,微信app的信息
getSystemInfo: function () {
var t = this;
wx.getSystemInfo({
success: function (a) {
//screenWidth,screenHeight屏幕宽高
var i = a.screenWidth / 375;
t.setData({
screenWidth: i,
canvasWidth: a.screenWidth / 375 * 250,
canvasHeight: a.screenWidth / 375 * 250
}), e.globalData.platform = a.platform;
}
})
},
第二步:绘制背景
//需要获取canvas,和h5一样
const ctx = wx.createCanvasContext('myCanvas')
draw: function (path) {
console.log(path)
var that = this
//背景图片路径
var path = path
//画布宽度 //画布高度
var canvasWidth = that.data.canvasWidth
var canvasHeight = that.data.canvasHeight
//getImageInfo()获取图片信息,倘若为网络图片,需先配置download域名才能生效。
wx.getImageInfo({
src: path,
success: function (res) {
//drawImage()绘制图像到画布。
//res.path所要绘制的图片资源
//0,0,是你要在画布的哪个位置开始画
//canvasWidth, canvasHeight你需要在画布上绘制多大的背景图,允许缩放
ctx.drawImage(res.path, 0, 0, canvasWidth, canvasHeight)
//画完第一层背景之后,调用合成图标的方法
that.headicon()
},
fail: function (res) {
console.log(res);
}
})
},
第三步:画好背景,合成图标,图片做好后,我利用canvasGetImageData()方法,把画布内容保存成base64的图片,如果有想用此方法的需要三个文件,我把它放在网盘,大家可以下载
链接:https://pan.baidu.com/s/1bHXpAGDdPkmQpgLt49wUGQ 密码:6riy
headicon: function () {
var that = this
//图标路径
var qrcodeUrl = this.data.qrcodeUrl;
//画布宽度 //画布高度
var canvasWidth = this.data.canvasWidth
var canvasHeight = this.data.canvasHeight
// 你需要把图标绘制到哪个位置(起点位置)
var x = canvasWidth - 80
var y = canvasHeight - 80
wx.getImageInfo({
src: qrcodeUrl,
success: function (res) {
ctx.drawImage(qrcodeUrl, x, y, 80, 80)
//保存当前画的状态
ctx.save();
//恢复当前画的状态
ctx.restore();
ctx.draw(false, () => {
// 2. 获取图像数据。canvasGetImageData()在ctx.draw()里使用在有效
wx.canvasGetImageData({
// 你需要获取那张画布的数据,获取多大范围的数据
canvasId: "myCanvas",
x: 0,
y: 0,
width: canvasWidth,
height: canvasHeight,
success:res=> {
// 3. png编码
let pngData = upng.encode([res.data.buffer], res.width, res.height)
// 4. base64编码,转成base64图片,就可以发送给后台保存了
let base64 = wx.arrayBufferToBase64(pngData)
that.setData({
generatePictures: base64
})
}
})
})
},
fail: function (res) {
console.log(res);
}
})
},
2小程序canvas使用,及一些坑,以及自己的一些小总结的更多相关文章
- 原创:WeZRender:微信小程序Canvas增强组件
WeZRender是一个微信小程序Canvas增强组件,基于HTML5 Canvas类库ZRender. 使用 WXML: <canvas style="width: 375px; h ...
- 记录一下小程序canvas
小程序canvas学习 效果图: .wxml <canvas style="width: 100vw; height: 100vh;" canvas-id="fir ...
- 微信小程序-canvas绘制文字实现自动换行
在使用微信小程序canvas绘制文字时,时常会遇到这样的问题:因为canvasContext.fillText参数为 我们只能设置文本的最大宽度,这就产生一定的了问题.如果我们绘制的文本长度不确定或者 ...
- 微信小程序 canvas 字体自动换行(支持换行符)
微信小程序 canvas 自动适配 自动换行,保存图片分享到朋友圈 https://github.com/richard1015/News 微信IDE演示代码https://developers.w ...
- 微信小程序--canvas画布实现图片的编辑
技术:微信小程序 概述 上传图片,编辑图片大小,添加文字,改变文字颜色等 详细 代码下载:http://www.demodashi.com/demo/14789.html 概述 微信小程序--ca ...
- 小程序canvas生成海报保存至手机相册
小程序canvas画图保存至手机相册 (1)可直接展示生成的海报 .因手机分辨率不同可能导致生成的海报会有细微差别,这里隐藏canvas海报,页面正常设置海报样式保存时保存隐藏的canvas海报 (2 ...
- 优化版小程序canvas,增加失败逻辑,及完善文字
wxml <view class="shareBox" style="backgound:{{isShow ? '#000' : '#fff'}}" wx ...
- 总结微信小程序开发中遇到的坑
总结微信小程序开发中遇到的坑,一些坑你得一个一个的跳啊,/(ㄒoㄒ)/~~ 1,页面跳转和参数传递实例 首先说一下我遇到的需求有一个我的消息页面,里面的数据都是后端返回的,返回的数据大致如下,有一个是 ...
- 小程序——微信小程序初学踩过的坑
微信小程序初学踩过的坑 一.前言 最近因为某些需要和个人兴趣打算开发一下微信小程序,经过在官方网站上的基本了解,我大体知道了微信小程序开发的大致过程,其实最本质的就是MVVM,借用了很多模式上 ...
- 微信小程序 | canvas绘图
1.新的尺寸单位 rpx rpx(responsive pixel): 可以根据屏幕宽度进行自适应. 规定屏幕宽为750rpx.如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则 ...
随机推荐
- vue上传图片 base64+canvas压缩图片
这是先将图片 base64转码 在拿canvas压缩的
- [搬运] 将 Visual Studio 的代码片段导出到 VS Code
原文 : A Visual Studio to Visual Studio Code Snippet Converter 作者 : Rick Strahl 译者 : 张蘅水 导语 和原文作者一样,水弟 ...
- bzoj 2002 : [Hnoi2010]Bounce 弹飞绵羊 (LCT)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 题面: 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: ...
- 【dp】导弹拦截
题目链接 https://www.luogu.org/problemnew/show/P1020 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的 ...
- CF802C Heidi and Library (hard)
题目描述 你有一个容量为k的空书架,现在共有n个请求,每个请求给定一本书ai,如果你的书架里没有这本书,你就必须以ci的价格购买这本书放入书架.当然,你可以在任何时候丢掉书架里的某本书.请求出完成这n ...
- Cucumber启动类配置
@CucumberOptions ( features = "src/test/resources", glue = {"Steps"}, tags = {&q ...
- spring Boot 入门--为什么用spring boot
为什么用spring boot 回答这个问题不得不说下spring 假设你受命用Spring开发一个简单的Hello World Web应用程序.你该做什么? 我能想到一些 基本的需要. 一个项目 ...
- Java:IO流-流的操作规律和转换流
首先我们先来了解一些IO流基本知识. 一,基本知识概括 具体的IO流有很多种,针对不同的应用场景应该使用相应的流对象.但怎么确定应该使用哪个IO流对象呢? 一般要有四个明确: 1)明确源和目的 源:I ...
- python7 数据类型的相互转化 字符编码
复习 1.深浅拷贝 ls = [1, 'a', [10]] 值拷贝:直接赋值 ls1 = ls, ls中的任何值发生改变,ls1中的值都会随之改变 浅拷贝:通过copy()方法 ls ...
- day23单例模式 , 日志处理 , 项目结构目录
# day23笔记 ## 一.补充,作业 ### 1.字符串格式化 ```pythonmsg = "我是%(n1)s,年龄%(n2)s" % {'n1': 'alex', 'n2' ...