uni-app如何将整个页面保存为图片,并且公众号h5中保存图片到相册

hykeda16小时前uniapp8

在 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

返回列表

上一篇:抢红包系统设计

没有最新的文章了...

相关文章

HBuilderX打开微信开发工具失败解决方案

先停止运行到微信开发工具, 然后在微信开发者工具设置-安全里面那个服务端口, 关闭再打开。重新运行就可以了 !...

uniapp开发微信小程序中使用block标签,在开发环境显示正常,生产环境中显示错误问题

在使用uniapp开发微信小程序时,使用了block标签进行了逻辑判断:<block v-show="list.type === 2">...

微信小程序 getUserProfile直接进入fail函数,getUserProfile调用失败:fail can only be invoked by user TAP gesture.

问题描述小程序更改了调用用户信息的接口调用getUserProfile直接进入失败返回的错误信息如下getUserProfile:fail can only be invoked by user TA...

uniapp微信小程序保存base64图片的方法

使用uni.getFileSystemManager().writeFile去下载base64图片<view class="share-btn" @click="s...

关于uniapp中v-for循环使用slice(0, 4)导致click事件报错问题

关于uniapp中v-for循环使用slice(0, 4)导致click事件报错问题

在使用uniapp开发时遇到只要循环数组的前四个值,使用了slice函数,在添加click事件后报错:_vm.e0 is not a function<view   ...

uni-app注意点

uni-app注意点

vue只会将已经在data中声明的属性变为响应,没有声明的是不响应的,特别是数组和对象千万要注意export default({    data(){    &...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。