<template>
<view class="template-login ">
<view class="tn-flex tn-flex-col-center tn-flex-row-center" style="margin-top: 200rpx;height: 100%;">
<canvas :canvas-id="canvasID" :style="{width:canvasWidth+'px',height:canvasHeight+'px'}"></canvas>
<view v-if="qrCode == ''">
<QRCode ref="qrcode" />
</view>
</view>
<view class="tn-flex tn-flex-col-center tn-flex-row-center">
<button type="primary" :disabled="qrCode != '' ? false : true" @click="saveImg()">保存图片</button>
</view>
</view>
</template>
<script>
import template_page_mixin from '@/libs/mixin/template_page_mixin.js'
import QRCode from "@/libs/qr_code/qrcode.vue"
var _this;
export default {
name: 'canvas-images',
mixins: [template_page_mixin],
props: {
newPic: "",
canvasID: {
Type: String,
default: 'shareCanvas'
},
canvasWidth: {
Type: 'int',
default: 375
},
canvasHeight: {
Type: 'int',
default: 400
},
shareTitle: {
Type: 'String',
default: ''
},
goodsTitle: {
Type: 'String',
default: ''
},
shareImage: {
Type: 'String',
default: '../../static/bg2.png'
},
qrSize: {
Type: 'int',
default: 200
},
qrUrl: {
Type: 'String',
default: 'https://xxxxx?types=FK&url="login/login"'
}
},
components: {
QRCode
},
data() {
return {
qrCode: '',
}
},
mounted() {
_this = this;
},
onReady() {
const dpr = wx.getSystemInfoSync().pixelRatio;
console.log('dpr' + dpr)
this.canvasWidth = 200 * dpr;
this.canvasHeight = 200 * dpr;
this.canvasCreate()
},
methods: {
createsShareImage() {
this.$refs.canvas.canvasCreate();
},
shareSuccess(e) {
_this.qrCode = e
},
onShareAppMessage(res) {
console.log(_this.qrCode)
return {
title: '图片分享',
path: _this.qrCode
}
},
canvasCreate() {
let userId = uni.getStorageSync("userinfo").userId
console.log(userId + "userId")
_this.qrUrl = "https://xxxxxxx?type=FK&userId=" + userId
_this.$refs.qrcode.make({
size: _this.qrSize,
text: _this.qrUrl
})
.then(res => {
_this.qrCode = res.tempFilePath;
_this.onCanvas();
});
},
async onCanvas() {
uni.showLoading({
title: "分享图片生成中..."
});
const ctx = uni.createCanvasContext(_this.canvasID, _this);
ctx.setFillStyle('#FFFFFF');
ctx.fillRect(0, 0, _this.canvasWidth, _this.canvasHeight);
ctx.setFillStyle('#FFFFFF');
ctx.drawImage(_this.shareImage, 20, 20, 340, 370, );
ctx.setFontSize(18);
ctx.setTextAlign('center');
ctx.fillText(_this.shareTitle, 375 / 2, 70);
ctx.setFillStyle('#3D7EFF');
ctx.setTextAlign('left')
ctx.setFontSize(16)
_this.writeTextOnCanvas(ctx, 28, 18, _this.goodsTitle, 120, 350);
ctx.drawImage(_this.qrCode, 70, 100, 230, 230);
let pic = await _this.setTime(ctx)
_this.$emit('success', pic);
_this.qr_code = '';
},
writeTextOnCanvas(ctx_2d, lineheight, bytelength, text, startleft, starttop) {
function getTrueLength(str) {
var len = str.length,
truelen = 0;
for (var x = 0; x < len; x++) {
if (str.charCodeAt(x) > 128) {
truelen += 2;
} else {
truelen += 1;
}
}
return truelen;
}
function cutString(str, leng) {
var len = str.length,
tlen = len,
nlen = 0;
for (var x = 0; x < len; x++) {
if (str.charCodeAt(x) > 128) {
if (nlen + 2 < leng) {
nlen += 2;
} else {
tlen = x;
break;
}
} else {
if (nlen + 1 < leng) {
nlen += 1;
} else {
tlen = x;
break;
}
}
}
return tlen;
}
for (var i = 1; getTrueLength(text) > 0; i++) {
var tl = cutString(text, bytelength);
ctx_2d.fillText(text.substr(0, tl).replace(/^\s+|\s+$/, ""), startleft, (i - 1) * lineheight +
starttop);
text = text.substr(tl);
}
},
setTime(ctx) {
return new Promise((resole, err) => {
setTimeout(() => {
ctx.draw(false, async () => {
let pic = await _this.getNewPic();
_this.newPic = pic;
console.log("pic==" + pic)
resole(pic)
});
}, 600)
})
},
saveImg() {
let url = _this.newPic;
uni.getImageInfo({
src: url,
success: (res) => {
let path = res.path;
uni.saveImageToPhotosAlbum({
filePath: path,
success: (res) => {
console.log(res);
wx.showToast({
title: '已保存到相册',
})
},
fail: (res) => {
console.log(res);
}
})
},
fail: (res) => {
console.log(res);
}
})
},
getNewPic() {
return new Promise((resolve, errs) => {
setTimeout(() => {
uni.canvasToTempFilePath({
canvasId: _this.canvasID,
quality: 1,
complete: (res) => {
uni.hideLoading();
resolve(res.tempFilePath)
}
}, _this);
}, 200)
})
},
},
mounted() {
_this = this;
},
goBack() {
const pages = getCurrentPages()
if (pages && pages.length > 0) {
const firstPage = pages[0]
if (pages.length == 1 && (!firstPage.route || firstPage.route != 'pages/index')) {
uni.reLaunch({
url: '/pages/index'
})
} else {
uni.navigateBack({
delta: 1
})
}
} else {
uni.reLaunch({
url: '/pages/index'
})
}
},
}
</script>
<style lang="scss" scoped>
/* 胶囊*/
.tn-custom-nav-bar__back {
width: 100%;
height: 100%;
position: relative;
display: flex;
justify-content: space-evenly;
align-items: center;
box-sizing: border-box;
background-color: rgba(0, 0, 0, 0.15);
border-radius: 1000rpx;
border: 1rpx solid rgba(255, 255, 255, 0.5);
color: #FFFFFF;
font-size: 18px;
.icon {
display: block;
flex: 1;
margin: auto;
text-align: center;
}
&:before {
content: " ";
width: 1rpx;
height: 110%;
position: absolute;
top: 22.5%;
left: 0;
right: 0;
margin: auto;
transform: scale(0.5);
transform-origin: 0 0;
pointer-events: none;
box-sizing: border-box;
opacity: 0.7;
background-color: #FFFFFF;
}
}
</style>
请具体描述问题出现的流程,并提供能复现问题的简单代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)。
我也遇到了,在p70 pro 126系统,canvas 直接不能使用,纯白的