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

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

以有涯随无涯,殆已!已而为知者,殆而已矣! ---庄周-

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

例如你玩星座付费解析后,需要把所有的分析结果变成图片保存到手机相册中,涉及到2个内容

1.如果把整个页面变成图片

2.公众号H5情况下如何保存图片到相册

技术来源

先说如何把整个页面变成图片,因为重新去做一个canvas去塞入众多内容不如直接把将整个页面保存为图片

用到技术来自文章:《uniapp如何实现将整个页面保存为图片功能

https://bbs.itying.com/topic/690343544a7a41007019982a

原理基本也就是把整个图片放入画布转成图片

H5平台

// 安装 html2canvas:npm install html2canvas
import 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标签直接显示 提示用户长按保存

uni-app如何将整个页面保存为图片,并且公众号h5中保存图片到相册
<!-- 保存页面按钮 -->
<view class="save-page-section">
   <view class="save-btn" @click="savePage">
       <text class="save-icon">📷</text>
       <text class="save-text">保存页面</text>
   </view>
 </view>        
 <!-- 弹窗 -->
<view class="preview-modal" v-if="showPreviewModal" @click="closePreviewModal">
      <view class="modal-content" @click.stop>
            <view class="modal-header">
                  <text class="modal-title">页面预览</text>
                  <text class="modal-close" @click="closePreviewModal">×</text>
            </view>
            <view class="modal-body">
                  <image v-if="previewImage" :src="previewImage" mode="aspectFit" class="preview-image"
                        show-menu-by-longpress />
                  <view class="preview-tip">
                        <text class="tip-icon">👆</text>
                        <text class="tip-text">长按图片保存到手机相册</text>
                  </view>
            </view>
      </view>
</view>

源码下载

由于代码很长,打包下载本地运行看看效果(注意需要真机才能长按保存)

https://www.123865.com/s/SmZtVv-fnegh