高建议使用 960
import {
baseURL
} from '../../utils/config.js'
Page({
data: {
baseURL: baseURL, //默认是域名
imgUrl:"",
},
async create_haibao() {
if(this.data.imgUrl.length>1){
wx.showShareImageMenu({
path: this.data.imgUrl
});
return;
}
let canvas = wx.createOffscreenCanvas({
type: "2d",
width: 1080,
height: 1787,
});
let context = canvas.getContext("2d");
// 绘制底色 - 渐变背景
const gradient = context.createLinearGradient(0, 0, 1080, 1787);
gradient.addColorStop(0, '#f5f7fa');
gradient.addColorStop(1, '#c3cfe2');
//渐变背景
//context.fillStyle = gradient;
context.fillStyle = '#ffffff'; // 纯白色
context.fillRect(0, 0, 1080, 1787);
// 设置文字样式
context.font = "bold 55px Microsoft YaHei"; // 加粗40px微软雅黑
context.fillStyle = "#000000"; // 黑色文字
context.textAlign = "left"; // 文字水平居中
context.textBaseline = "middle"; // 文字垂直居中
// 绘制名称
context.fillText("小米商城", 280, 80); // 在(300,100)位置绘制文字
//绘制时间
context.font = "35px Microsoft YaHei"; // 加粗40px微软雅黑
context.fillText("2025-08-08 12:22", 280, 180);
// 绘制标题 一行20个字, 2行16个字后面...
var title = "根据你的需求,我可以帮你根据你的需求,我可以帮你:根据你的需求,我可以帮你:根据你的需求,我可以帮你::";
// 分割成两行
var firstLine = title.substring(0, 20);
var secondLine = title.substring(20);
secondLine = secondLine.length > 16 ? secondLine.substring(0, 16) + "..." : secondLine;
console.log("第一行: " + firstLine);
console.log("第二行: " + secondLine);
context.font = "bold 45px Microsoft YaHei"; // 加粗40px微软雅黑
context.textAlign = "left"; // 文字水平居中
context.fillStyle = "#000000"; // 黑色文字
var title_y = 1200;
context.fillText(firstLine, 60, title_y);
context.fillText(secondLine, 60, title_y + 80);
//绘制摘要 一行25个字, 2行20个字后面...
// var desc = "绘制摘要 一行25个字, 2行20个字后面...";
// var firstLine = desc.substring(0, 25);
// var secondLine = desc.substring(25);
// secondLine = secondLine.length > 20 ? secondLine.substring(0, 20) + "..." : secondLine;
// context.font = "21px Microsoft YaHei"; // 加粗40px微软雅黑
// context.textAlign = "left"; // 文字水平居中
// context.fillStyle = "#000000"; // 黑色文字
// var desc_y = 790;
// context.fillText(firstLine, 50, desc_y);
// context.fillText(secondLine, 50, desc_y + 40);
//绘制 价格 ¥9.9-100
context.font = "bold 50px Microsoft YaHei"; // 加粗40px微软雅黑
context.textAlign = "left"; // 文字水平居中
context.fillStyle = "#FF5722"; // 橙色
context.fillText("¥9.9-100", 60, 1400);
// 绘制灰色长方形
context.fillStyle = '#c5c5c5'; // 标准灰色
context.fillRect(50, 1555, 450, 80); // 600*30的长方形
//绘制 提示
context.font = "45px Microsoft YaHei"; // 加粗40px微软雅黑
context.textAlign = "left"; // 文字水平居中
context.fillStyle = "#000000"; // 黑色
context.fillText("长按识别小程序码", 80, 1600);
// 图片加载部分修改为:
const loadImage = (src) => {
return new Promise((resolve, reject) => {
const img = canvas.createImage();
img.onload = () => resolve(img);
img.onerror = (err) => {
console.error('图片加载失败:', src, err);
reject(err);
};
img.src = src.includes('http') ? src : `/static/${src}`;
});
};
try {
const [logo, img, qr] = await Promise.all([
loadImage(this.data.baseURL + "/static/upload_image/blog_cover/20250624/20250624004044.jpg"),
loadImage(this.data.baseURL + "/static/upload_image/blog_cover/20250624/20250624004044.jpg"),
loadImage(this.data.baseURL + "/static/upload_image/blog_cover/20250624/20250624004044.jpg")
]);
context.drawImage(logo, 40, 40, 200, 200);
context.drawImage(img, 110, 300, 850, 850);
context.drawImage(qr, 600, 1350, 400, 400);
//toDataURL(string type, number encoderOptions)
//String type 图片格式,默认为 image/png
// number encoderOptions 在指定图片格式为 image/jpeg 或 image/webp的情况下,可以从 0 到 1 的区间内选择图片的质量。
//如果超出取值范围,将会使用默认值 0.92。其他参数会被忽略。
const imageUrl = canvas.toDataURL("image/jpeg", 1);
this.setData({
img: imageUrl
});
const fs = wx.getFileSystemManager();
const timestamp = new Date().getTime();
console.log(timestamp)
const filePath = `${wx.env.USER_DATA_PATH}/share_${timestamp}.jpg`;
const base64Data = imageUrl.replace(/^data:image\/\w+;base64,/, '');
fs.writeFileSync(filePath, base64Data, 'base64');
this.setData({
imgUrl:filePath
})
wx.showShareImageMenu({
path: filePath
});
} catch (e) {
console.error('海报生成失败:', e);
wx.showToast({
title: '海报生成失败',
icon: 'none'
});
}
},
onLoad(options) {},
onReady() {},
onShow() {},
onHide() {
},
onUnload() {
},
onPullDownRefresh() {
},
onReachBottom() {
},
onShareAppMessage() {
}
})wxml
<view style="padding: 35rpx; background-color: #d0d0d0;">
<image mode="widthFix" style="width: 100%; border: 1rpx solid black;" src="{{img}}"></image>
</view>
<button bind:tap="create_haibao">创建海报</button>修改后的海报 分辨率高了 高清了很多


海报生成失败: Error: writeFileSync:fail the maximum size of the file storage limit is exceeded at Ub (WAServiceMainContext.js?t=wechat&v=3.8.12:1) at Object.<anonymous> (WAServiceMainContext.js?t=wechat&v=3.8.12:1) at I (WAServiceMainContext.js?t=wechat&v=3.8.12:1) at Object.p (WAServiceMainContext.js?t=wechat&v=3.8.12:1) at _callee$ (index.js? [sm]:172) at s (<anonymous>:1:1588) at Generator.<anonymous> (<anonymous>:1:2925) at Generator.next (<anonymous>:1:1951) at asyncGeneratorStep (<anonymous>:1:906) at c (<anonymous>:1:1125)(env: Windows,mp,1.06.2504010; lib: 3.8.12)
这个错误表明微信小程序的本地文件存储空间已超过限制,导致海报生成失败。以下是解决方案和优化建议:
清理已存储的临时文件
检查文件存储限制
微信小程序本地文件存储总大小限制为10MB3
单个文件不得超过4MB限制
长期解决方案
定期清理生成的临时文件
将大文件存储到云开发或服务器
压缩图片资源后再处理
// 新版写法
const fs = wx.getFileSystemManager()
fs.getSavedFileList({
success(res) {
console.log(res.fileList)
res.fileList.forEach((file) => {
wx.removeSavedFile({ filePath: file.filePath })
})
}
})
建议配合fs.removeSavedFile定期清理缓存文件
wx.removeSavedFile({ filePath: file.filePath })站长微信:xiaomao0055
站长QQ:14496453