uniapp 微信小程序使用canvas
微信小程序基础库大于2.9.0后,canvas(画布)支持一套新 Canvas 2D 接口(需指定 type 属性),同时支持同层渲染,原有接口不再维护。在这种情况下使用原有接口会报错,报错例如:
1、使用ctx.draw()会报错:draw is not a function,原因:新版 Canvas 2D 接口没有 draw 方法
2、使用ctx.setfillStyle('white')会报错:ctx.setfillStyle is not a function,原因:新版 Canvas 2D 接口没有setfillStyle方法,改用fillStyle
3、使用ctx.setFontSize(20)会报错:ctx.setFontSize is not a function,原因:新版 Canvas 2D 接口没有setFontSize方法,改用font
4、使用wx.canvasToTempFilePath会报错:canvasToTempFilePath: fail canvas is empty,原因:当使用Canvas 2D时,应该使用canvas属性而不是canvasId属性
以上均是使用Canvas 2D之后导致的问题,可以改用新写法,新写法如下:
<template>
<view>
<uni-nav-bar leftIcon="arrowleft" :status-bar="true" fixed="true" color="#ffffff" bgImage="linear-gradient(45deg, #ec008c, #6739b6)" title="移动开发框架" />
<view class="drawBtn">生成图片</view>
<!-- 画布 -->
<canvas type="2d" class='canvas-poster' canvas-id='canvasposter' id="canvasposter"></canvas>
</view>
</template>
<script>
import uniNavBar from '@/components/uni-nav-bar/uni-nav-bar.vue'
export default {
data() {
return {
}
},
components: {
uniNavBar
},
onLoad() {
},
methods: {
//绘制到canvas
viewDrawToCanvas: function() {
let that = this
const query = uni.createSelectorQuery()
query.in(this).select('#canvasposter')
.fields({
node: true,
size: true
})
.exec((res) => {
const canvas = res[0].node // 获取画布节点对象
const ctx = canvas.getContext('2d')
canvas.width = 794 // 画布宽度
canvas.height = 1123 // 画布高度
ctx.rect(0, 0, canvas.width, canvas.height)
ctx.fillStyle = 'white' // 设置样式
ctx.fillRect(0, 0, canvas.width, canvas.height)
// 画布填充文字
ctx.font = '28px SimSun' // 设置文字样式
ctx.fillStyle = '#333333'
ctx.fillText('文案', 16, 56)
// 图表图片
let img = canvas.createImage()
img.src = imgBase64
img.onload = () => {
ctx.drawImage(img, 0, 0, img.width, img.height, 50, 170, img.width * 0.7, img.height * 0.7)
uni.canvasToTempFilePath({
canvas: canvas,
width: canvas.width,
height: canvas.height,
destWidth: canvas.width,
destHeight: canvas.height,
fileType: 'png',
quality: '1',
success: (res) => {
console.log(res.tempFilePath)
that.saveImageToPhotosAlbum(res.tempFilePath)//保存到相册
},
fail: (err) => {
console.log(err)
}
})
}
})
},
//把生成的图片保存至相册
saveImageToPhotosAlbum: function(imgUrl) {
uni.hideLoading();
if (imgUrl) {
uni.saveImageToPhotosAlbum({
filePath: imgUrl,
success: (res) => {
uni.showToast({
title: '保存成功',
icon: 'success',
duration: 2000
})
},
fail: (err) => {
uni.showToast({
title: '保存失败',
icon: 'none',
duration: 2000
})
}
})
}
else {
uni.showToast({
title: '绘制中……',
icon: 'loading',
duration: 3000
})
}
},
}
}
</script>
<style>
.drawBtn{
width: 650upx;
height: 80upx;
line-height: 80upx;
text-align: center;
color: #FFFFFF;
background-image: linear-gradient(45deg, #ec008c, #6739b6);
border-radius: 20upx;
margin: 200upx 50upx;
}
/* 绘制图片canvas样式 */
.canvas-poster {
position: fixed;
top: 100%;
left: 100%;
}
</style>