uni-app 实战:使用 lime-painter 实现页面内容一键生成海报并下载

uni-app 实战:使用 lime-painter 实现页面内容一键生成海报并下载

在开发 uni-app 应用时,将页面上的内容一键生成图片并保存到相册是一个非常常见的需求,比如生成分享海报、订单卡片、个人名片等。


一、需求分析

我们要实现的核心功能:

  1. 页面展示天气海报列表(包含图片、文字、样式)
  2. 点击下载按钮,将页面上的卡片内容生成一张完整的图片
  3. 支持 H5 直接下载小程序/App 保存到系统相册
  4. 多端兼容,样式还原度 100%

二、第一步:插件市场导入 lime-painter

lime-painter 是 uni-app 生态中一款零配置、可视化、高性能的 canvas 海报绘制插件,完美适配 Vue3/Vue2、小程序/App/H5。

1. 插件市场导入

打开 DCloud 插件市场

点击 导入 HBuilderX,选择你的项目导入即可。

2. 项目中引入组件

在需要使用的页面直接引入,无需全局注册:

javascript 复制代码
<script setup>
// 直接引入插件目录下的组件
import lPainter from '@/uni_modules/lime-painter/components/l-painter/l-painter.vue'
import lPainterView from '@/uni_modules/lime-painter/components/l-painter-view/l-painter-view.vue'
import lPainterImage from '@/uni_modules/lime-painter/components/l-painter-image/l-painter-image.vue'
import lPainterText from '@/uni_modules/lime-painter/components/l-painter-text/l-painter-text.vue'
</script>

三、核心思路: 海报绘制

  1. 用 lime-painter 复刻一份和页面一模一样的结构
  2. 点击下载时,把当前卡片数据传给绘制组件
  3. 用 canvas 生成图片
  4. 调用下载/保存相册 API

四、页面结构编写

1. 海报绘制区域(隐藏在页面底部)

这部分是真正用来生成图片的,样式和页面完全一致:

javascript1 复制代码
<!-- 海报绘制容器,默认不显示在页面可视区域 -->
<l-painter ref="painter">
  <l-painter-view css="border-radius: 16rpx;overflow: hidden;">
    <!-- 背景图 -->
    <l-painter-view css="text-align:center;background-image:url('bg.png');background-size:cover;">
      
      <!-- 天气图片 -->
      <l-painter-image :src="dataInfos.img" css="width:100%;border-radius:16rpx" />
      
      <!-- 诗词 -->
      <l-painter-text :text="dataInfos.poetry" css="text-align:center;font-size:28rpx;color:#333" />
      
      <!-- 分割线 -->
      <l-painter-view css="width:90%;height:2rpx;background:#e5e5e5;margin:0 auto" />
      
      <!-- 城市 -->
      <l-painter-text :text="`一${dataInfos.city}一`" css="font-size:30rpx" />
      
      <!-- 日期/天气 -->
      <l-painter-text :text="`${dataInfos.date}/${dataInfos.condition}`" css="font-size:26rpx;color:#666" />
      
      <!-- 温度 -->
      <l-painter-text :text="`最高${dataInfos.temp_high}℃ 最低${dataInfos.temp_low}℃`" css="font-size:26rpx" />
    </l-painter-view>
  </l-painter-view>
</l-painter>

五、JS 逻辑:下载与生成图片(核心)

1. 定义数据

js 复制代码
// 绘制海报用的数据
const dataInfos = ref({})
// 绘制组件实例
const painter = ref(null)

2. 下载方法(完整代码)

js 复制代码
const download = (item, index) => {
  // 1. 将当前点击的卡片数据赋值给绘制组件
  dataInfos.value = {
    ...item,
    ...JSON.parse(item.param),
    ...JSON.parse(item.result)
  }

  // 显示加载提示
  uni.showLoading({ title: "海报生成中..." })

  // 2. 等待 DOM 更新完成再生成图片
  nextTick(() => {
    painter.value.canvasToTempFilePathSync({
      fileType: "jpg",
      pathType: 'url', // 关键:必须是 url 才能保存相册
      quality: 1,
      success: (res) => {
        // H5 端:创建a标签下载
        // #ifdef H5
        let a = document.createElement('a')
        a.href = res.tempFilePath
        a.download = '天气海报.jpg'
        a.click()
        uni.hideLoading()
        // #endif

        // 小程序/App 端:保存到相册
        // #ifndef H5
        uni.saveImageToPhotosAlbum({
          filePath: res.tempFilePath,
          success: () => {
            uni.hideLoading()
            uni.showToast({ title: "已保存到相册", icon: "none" })
          }
        })
        // #endif
      },
      fail: (err) => {
        console.log("生成失败:", err)
        uni.hideLoading()
      }
    })
  })
}

六、样式优化(保证生成效果与页面一致)

less 复制代码
.result-count-bg {
  min-height: 200rpx;
  background-image: url('你的背景图地址');
  background-size: cover;
  padding: 20rpx;
  border-radius: 16rpx;

  .weather-image {
    width: 100%;
    border-radius: 16rpx;
  }
}

七、关键知识点总结(避坑指南)

1. 必须加 nextTick

数据更新后,必须等待视图渲染完成再生成图片,否则会空白。

2. pathType: 'url'

小程序中 base64 无法保存到相册 ,必须设置 pathType: 'url'

3. 图片必须加域名白名单

后台配置好 download、upload 域名,否则图片无法绘制。

4. 多端条件编译

  • H5:a标签下载
  • 小程序/App:uni.saveImageToPhotosAlbum

八、最终效果




结语

使用 lime-painter 可以极低成本实现 uni-app 页面内容生成图片功能,无需手写复杂 canvas 语法,样式直接复制页面即可,还原度极高、稳定性强。

相关推荐
2501_915909061 天前
不用越狱就看不到 iOS App 内部文件?使用 Keymob 查看和导出应用数据目录
android·ios·小程序·https·uni-app·iphone·webview
万物得其道者成1 天前
uni-app Android 离线打包:多环境(prod/dev)配置
android·opencv·uni-app
学习3人组1 天前
Uniapp快速上手了解
uni-app
小鲤鱼ya1 天前
vue3 + ts + uni-app 移动端封装图片上传添加水印
前端·typescript·uni-app·vue3
2501_915921431 天前
常用iOS性能测试工具大全及使用指南
android·测试工具·ios·小程序·uni-app·cocoa·iphone
桐溪漂流1 天前
Uni-app H5 环境下 ResizeObserver 监听 mp-html 动态高度
前端·uni-app·html
芒果大胖砸1 天前
uniapp 在h5中预览pdf hybrid方法
pdf·uni-app
清音啊1 天前
Uniapp 实现左滑显示操作按钮的列表(适配多端 + 实战案例)
uni-app
蜡台1 天前
Uniapp 实现 二手车价格评估 功能
前端·javascript·uni-app·估值·汽车抵押·二手车评估