赞
踩
<canvas id="myCanvas" type="2d"
style="width: {{ canvas.width }}px;height: {{ canvas.height }}px;">
</canvas>
<button bindtap="generatePicture">生成图片</button>
data:{
canvas:{ width:150, height:300 },
},
onReady() {
this.createSelectorQuery().select('#myCanvas')
.fields({ node: true, size: true })
.exec((res) => {
this.setData({
canvas: res[0].node
})
})
},
// 拿到图片信息,获取宽高,使其完整地将显示在页面上 // 类似于 <image mode="aspectFit"/> // 可以跳过此步骤 generatePicture(){ return this.apiPromise('getImageInfo', { src: 图片路径 }) .then(e=>{ const canvas = this.data.canvas const { screenWidth, screenHeight } = wx.getSystemInfoSync() const { width, height } = e const multipleH = height/screenHeight const multipleW = width/screenWidth if(width/multipleH>screenWidth){ canvas.width = width/multipleW canvas.height = height/multipleW }else { canvas.width = width/multipleH canvas.height = height/multipleH } this.setData({ canvas, }) return this.drawImage(this.data.canvas) }) },
drawImage({width, height}){
return new Promise(resolve=>{
const ctx = this.data.canvas.getContext('2d')
const img = this.data.canvas.createImage()
img.src = this.data.originUrl
img.onload = () => {
ctx.drawImage(img, 0, 0, width, height)
resolve(this.drawText(ctx, width, height))
}
})
},
drawText(ctx, width, height){
const values = [{
color:'red', // 文字颜色
size:18, // 文字大小
x:0, // 文字坐标
y:0, // 文字坐标
text:'测试文字', // 文字
}]
values.forEach(item=>{
ctx.fillStyle = item.color
ctx.font = `${item.size}px sans-serif`
ctx.fillText(item.text, item.x, item.y)
})
return this.exportCanvasImage(width, height)
},
res.tempFilePath
为图片路径 exportCanvasImage(width, height){
return this.apiPromise('canvasToTempFilePath',{
canvas: this.data.canvas,
width,
height,
})
.then(res=>{
return res.tempFilePath
})
},
/** * 将wx api转为promise 执行 * 示例 : apiPromise('getUserProfile',{ desc:'获取用户信息' }) * @param { String } api wx api 名字 * @param { Object } arg 参数 * @returns { Promise } */ apiPromise(api, arg = {}){ return new Promise((resolve, reject) => { const success = arg.success const fail = arg.success arg.success = (e) => { resolve(e) success?.apply(this, e) } arg.fail = (e) => { reject(e) fail?.apply(this, e) } wx[api](arg) }) }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。