最新文章
小程序Canvas实战:轻松生成自定义二维码
weapp-qrcodenpm install weapp-qrcode --save
<view class="container">
<view class="canvas-container">
<canvas
canvas-id="qrcodeCanvas"
style="width: 300px; height: 300px;"
class="qrcode-canvas"
></canvas>
</view>
<view class="controls">
<input
type="text"
placeholder="输入二维码内容"
bindinput="onInputChange"
value="{{text}}"
class="input-box"
/>
<view class="style-controls">
<view class="color-picker">
<text>主色:</text>
<input type="color" bindinput="onColorChange" value="{{darkColor}}" />
</view>
<view class="color-picker">
<text>背景色:</text>
<input type="color" bindinput="onBgColorChange" value="{{lightColor}}" />
</view>
</view>
<button bindtap="toggleLogo" class="btn">
{{showLogo ? '移除Logo' : '添加Logo'}}
</button>
<button bindtap="saveImage" class="btn save-btn">保存到相册</button>
</view>
</view>.container {
display: flex;
flex-direction: column;
align-items: center;
padding: 20rpx;
background: #f5f5f5;
min-height: 100vh;
}
.canvas-container {
background: white;
border-radius: 16rpx;
padding: 20rpx;
box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.1);
margin-bottom: 40rpx;
}
.controls {
width: 100%;
max-width: 600rpx;
}
.input-box {
width: 100%;
height: 80rpx;
background: white;
border-radius: 8rpx;
padding: 0 20rpx;
margin-bottom: 30rpx;
box-shadow: 0 2rpx 6rpx rgba(0,0,0,0.05);
}
.style-controls {
display: flex;
justify-content: space-between;
margin-bottom: 30rpx;
}
.color-picker {
display: flex;
align-items: center;
background: white;
padding: 10rpx 20rpx;
border-radius: 8rpx;
box-shadow: 0 2rpx 6rpx rgba(0,0,0,0.05);
}
.color-picker text {
margin-right: 10rpx;
font-size: 28rpx;
}
.btn {
width: 100%;
height: 80rpx;
line-height: 80rpx;
background: #07c160;
color: white;
border-radius: 8rpx;
margin-bottom: 20rpx;
font-size: 32rpx;
}
.save-btn {
background: #1a6bff;
margin-top: 30rpx;
}
.qrcode-canvas {
border: 1rpx solid #eee;
}import QRCode from 'weapp-qrcode';
Page({
data: {
text: 'https://example.com',
darkColor: '#000000',
lightColor: '#ffffff',
showLogo: false
},
onReady() {
this.drawQRCode();
},
onInputChange(e) {
this.setData({ text: e.detail.value });
this.drawQRCode();
},
onColorChange(e) {
this.setData({ darkColor: e.detail.value });
this.drawQRCode();
},
onBgColorChange(e) {
this.setData({ lightColor: e.detail.value });
this.drawQRCode();
},
toggleLogo() {
this.setData({ showLogo: !this.data.showLogo });
this.drawQRCode();
},
drawQRCode() {
const { text, darkColor, lightColor, showLogo } = this.data;
// 获取Canvas上下文
const ctx = wx.createCanvasContext('qrcodeCanvas', this);
// 清空画布
ctx.clearRect(0, 0, 300, 300);
// 创建二维码
const qrcode = new QRCode(ctx, {
text: text || 'https://example.com',
width: 300,
height: 300,
colorDark: darkColor,
colorLight: lightColor,
correctLevel: QRCode.CorrectLevel.H
});
// 绘制二维码
qrcode.make();
// 添加Logo
if (showLogo) {
ctx.drawImage('/images/logo.png', 125, 125, 50, 50);
}
// 添加外框装饰
ctx.setStrokeStyle(darkColor);
ctx.setLineWidth(4);
ctx.strokeRect(10, 10, 280, 280);
// 添加中心装饰
ctx.beginPath();
ctx.arc(150, 150, 30, 0, 2 * Math.PI);
ctx.setFillStyle(lightColor);
ctx.fill();
// 绘制到Canvas
ctx.draw();
},
saveImage() {
wx.canvasToTempFilePath({
canvasId: 'qrcodeCanvas',
success: (res) => {
wx.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: () => {
wx.showToast({
title: '保存成功',
icon: 'success'
});
},
fail: (err) => {
console.error('保存失败', err);
wx.showToast({
title: '保存失败,请检查权限',
icon: 'none'
});
}
});
},
fail: (err) => {
console.error('生成临时文件失败', err);
}
});
}
});// 获取设备像素比
const dpr = wx.getSystemInfoSync().pixelRatio;
// 设置Canvas实际尺寸
const canvasWidth = 300 * dpr;
const canvasHeight = 300 * dpr;
// 设置Canvas显示尺寸
this.setData({
canvasStyle: `width: 300px; height: 300px;`
});// 四个容错级别可选
QRCode.CorrectLevel = {
L: 1, // 约可纠错7%的数据
M: 0, // 约可纠错15%的数据
Q: 3, // 约可纠错25%的数据
H: 2 // 约可纠错30%的数据(最高)
};cover-view// 在二维码周围添加旋转动画
ctx.beginPath();
ctx.arc(150, 150, 160, 0, 2 * Math.PI);
ctx.setStrokeStyle('#ff6b6b');
ctx.setLineWidth(3);
ctx.setLineDash([10, 5]);
ctx.stroke();
// 添加旋转动画
this.animateCircle(ctx);// 创建渐变对象
const gradient = ctx.createLinearGradient(0, 0, 300, 300);
gradient.addColorStop(0, '#ff9a9e');
gradient.addColorStop(1, '#fad0c4');
// 使用渐变填充
qrcode.colorDark = gradient;
// 绘制背景图
ctx.drawImage('/images/background.jpg', 0, 0, 300, 300);
// 在背景上绘制半透明覆盖层
ctx.setFillStyle('rgba(255,255,255,0.7)');
ctx.fillRect(0, 0, 300, 300);
// 在上面绘制二维码
qrcode.make();onReady// 在保存前检查权限
wx.getSetting({
success: (res) => {
if (!res.authSetting['scope.writePhotosAlbum']) {
wx.authorize({
scope: 'scope.writePhotosAlbum',
success: () => this.saveImage(),
fail: () => wx.openSetting()
});
} else {
this.saveImage();
}
}
});












冀公网安备