uni-app如何将整个页面保存为图片,并且公众号h5中保存图片到相册
在 UniApp 中,可以通过 html2canvas 的替代方案或原生 API 实现将整个页面保存为图片。由于 UniApp 跨平台特性,不同平台(如 H5、小程序)的实现方式不同。以下是具体方法:
1. H5 平台
使用 html2canvas 库捕获 DOM 并生成图片:
// 安装 html2canvas:npm install html2canvasimport html2canvas from 'html2canvas';// 方法示例async function capturePage() {
const element = document.getElementById('capture-area'); // 指定要截图的区域
const canvas = await html2canvas(element, {
useCORS: true, // 允许跨域图片
scale: 2 // 提高清晰度
});
// 转换为图片并下载
const imgData = canvas.toDataURL('image/png');
const link = document.createElement('a');
link.href = imgData;
link.download = 'page-screenshot.png';
link.click();}2. 微信小程序平台
使用小程序的 canvas 组件和 API:
<!-- 在模板中添加 canvas --><canvas id="myCanvas" canvas-id="myCanvas" style="width:100%;height:100vh;"></canvas>
// 在 methods 中定义方法methods: {
savePageAsImage() {
const query = uni.createSelectorQuery().in(this);
query.select('#capture-area').fields({ node: true, size: true }).exec(res => {
const node = res[0].node;
// 创建 canvas 上下文
const ctx = uni.createCanvasContext('myCanvas', this);
ctx.drawImage(node, 0, 0, 300, 200); // 调整尺寸
ctx.draw(false, () => {
// 保存到相册
uni.canvasToTempFilePath({
canvasId: 'myCanvas',
success: res => {
uni.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: () => uni.showToast({ title: '保存成功' })
});
}
});
});
});
}}注意事项:
跨平台兼容性:需通过条件编译区分平台(
#ifdef H5、#ifdef MP-WEIXIN)。权限问题:小程序需用户授权相册权限(
scope.writePhotosAlbum)。性能优化:复杂页面可能渲染较慢,建议隐藏非必要元素。
完整示例(H5 + 微信小程序):
export default {
methods: {
savePage() {
// #ifdef H5
this.captureH5Page();
// #endif
// #ifdef MP-WEIXIN
this.captureMiniProgramPage();
// #endif
},
captureH5Page() { /* H5 实现 */ },
captureMiniProgramPage() { /* 小程序实现 */ }
}}通过以上方法,即可在 UniApp 中实现页面保存为图片功能。
# 技术来源
先说如何把整个页面变成图片,因为重新去做一个canvas去塞入众多内容不如直接把将整个页面保存为图片
用到技术来自文章:《uniapp如何实现将整个页面保存为图片功能》
https://bbs.itying.com/topic/690343544a7a41007019982a
原理基本也就是把整个图片放入画布转成图片
H5平台
// 安装 html2canvas:npm install html2canvasimport html2canvas from 'html2canvas';// 方法示例async function capturePage() { const element = document.getElementById('capture-area'); // 指定要截图的区域 const canvas = await html2canvas(element, { useCORS: true, // 允许跨域图片 scale: 2 // 提高清晰度 }); // 转换为图片并下载 const imgData = canvas.toDataURL('image/png'); const link = document.createElement('a'); link.href = imgData; link.download = 'page-screenshot.png'; link.click();}
微信小程序平台
<!-- 在模板中添加 canvas --><canvas id="myCanvas" canvas-id="myCanvas" style="width:100%;height:100vh;"></canvas>
// 在 methods 中定义方法methods: { savePageAsImage() { const query = uni.createSelectorQuery().in(this); query.select('#capture-area').fields({ node: true, size: true }).exec(res => { const node = res[0].node; // 创建 canvas 上下文 const ctx = uni.createCanvasContext('myCanvas', this); ctx.drawImage(node, 0, 0, 300, 200); // 调整尺寸 ctx.draw(false, () => { // 保存到相册 uni.canvasToTempFilePath({ canvasId: 'myCanvas', success: res => { uni.saveImageToPhotosAlbum({ filePath: res.tempFilePath, success: () => uni.showToast({ title: '保存成功' }) }); } }); }); }); }}
# 如何保存图片
在uni-app开发H5的环境下是无法使用uni.saveImageToPhotosAlbum;在浏览器中可以直接a标签打开图片进行下载。但是在微信开发工具和公众号H5真机测试是没办法实现的
而canvas转成的画布是Base64,也无法使用uni.previewImage预览;只能通过image标签直接显示 提示用户长按保存
# 源码下载
由于代码很长,打包下载本地运行看看效果(注意需要真机才能长按保存)
https://www.123865.com/s/SmZtVv-fnegh
转:https://mp.weixin.qq.com/s/mNEuIGzcPL2n4vDQmoeSgg

