微信小程序Snapshot导出海报

开启skyline

app.json

json 复制代码
"lazyCodeLoading": "requiredComponents",
  "renderer": "skyline",
  "componentFramework": "glass-easel",
  "rendererOptions": {
    "skyline": {
      "defaultDisplayBlock": true
    }
  }

设置版本库

设置版本库>=3.0.1

编写代码

index.wxml

html 复制代码
<snapshot id="view" class="intro">
  <view class="snapshot-box">
	<view class="poster-container">
		<view class="poster-header">
			<image class="head-img" src="https://res.wx.qq.com/op_res/g8_iWdQLmR5dKwrKW-c1fRZc7XRYP6z_rp1f-BDMmQ41BOjsDigYKkO6VQqj6aZoyVKUtTuJEEvOJuv3av8U2Q" />
			<view class="poster-header-text">
				<text>binnie</text>
				<text>发起 Skyline 学习活动</text>
			</view>
		</view>

		<view class="description">
			<view class="schedule-text">
				<view>学 习 进 度</view>
				<view class="detail">80%</view>
			</view>
			<view class="schedule">
				<view class="schedule-all">
					<view class="schedule-real"></view>
				</view>
			</view>
			<view class="members">
				<view class="member">
					<image class="head-img" src="https://res.wx.qq.com/op_res/g8_iWdQLmR5dKwrKW-c1fRZc7XRYP6z_rp1f-BDMmQ41BOjsDigYKkO6VQqj6aZoyVKUtTuJEEvOJuv3av8U2Q" />
					<view class="leader">队长</view>
				</view>
				<view class="member">
					<image class="head-img" src="https://res.wx.qq.com/op_res/v9cRw50kNOp93AQJWHjbjiOstqoOZHQgfWzWpJiK02jKt6i5HBHWD3IUpgMSneSW5_26oHaJLddq-h6A3wEI_A" />
					<view>
						<text>binnnnnnn</text>
					</view>
				</view>
				<view class="member">
					<image class="head-img" src="https://res.wx.qq.com/op_res/v9cRw50kNOp93AQJWHjbjl-OdWB18klNWCsWqEECTnxAvN-_EaCkgGXNjwANvi4_gIM3MrAHHZiGBK1ooFzmyg" />
					<view>🚜拖</view>
				</view>
			</view>
		</view>

		<view class="line">
			<view class="left-line"></view>
			<view class="real-line"></view>
			<view class="right-line"></view>
		</view>
		
		<view class="footer">
			<view class="qrcode">
				<image mode="aspectFill" src="https://res.wx.qq.com/wxdoc/dist/assets/img/skyline-demo.37eff20b.png"></image>				
			</view>
			<view class="qrcode">
				<text>长按识别小程序码来一起学习吧</text>
			</view>
		</view>
	</view>
  </view>
</snapshot>

<button type="primary" bindtap="tap">保存海报到本地</button>

wxss

css 复制代码
@font-face {
  font-family: "test";
  src: url("https://wximg.qq.com/cityservices/font/FZFWQingYinTiJWD.TTF");
}
.intro {
  margin: 90px 30px 30px;
  text-align: center;
}
.snapshot-box {
  font-family: "test";
  padding: 20px 16px;
  background: url(https://res.wx.qq.com/op_res/tOwqPm31NVc7GmNdujMfgpUebQbZeRW4YD79TYkVfJsoJX4cDuQwVWygj-bviemXbUFoMGM9c_7q7-2RT071Vw) 30%;
}
.poster-img {
  width: 100%;
}
.poster-container {
  background: linear-gradient(#229156, #2fce7c);
  padding: 20px 16px;
  border-radius: 10px;
}
.poster-header {
  display: flex;
  flex-direction: row;
  align-items: center;
}
.poster-header-text {
  font-size: 14px;
  line-height: 1.8;
  color: #fff;
  font-weight: bold;
  padding-left: 10px;
  text-align: left;
}
.head-img {
  width: 48px;
  height: 48px;
  border-radius: 50%;
}
.description {
  margin: 20px 0;
  padding: 20px 0;
  background-color: #fff;
  border-radius: 10px;
}
.schedule-text {
  font-size: 20px;
  font-weight: bold;
}
.schedule-text .detail{
  font-size: 30px;
  font-weight: 500;
  margin: 10px 0;
}
.schedule {
  flex-direction: row;
  align-items: center;
  justify-content: center;
  display: flex;
  position: relative;
}
.schedule-all {
  width: 90%;
  height: 14px;
  background-color: #eeeeee;
  border-radius: 20px;
}
.schedule-real {
  position: absolute;
  width: 80%;
  height: 14px;
  background: linear-gradient(90deg, #2fce7c, #229156);
  border-radius: 20px;

}
.members {
  display: flex;
  flex-direction: row;
  justify-content: center;
}
.member {
  margin: 10px;
}
.member view {
  width: 48px;
  background-color: #c5ebdd;
  color: #07c160;
  border-radius: 20px;
  margin-top: -8px;
  font-size: 12px;
  line-height: 1.6;
  padding: 0 6px;
}
.member view text {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
.member .leader {
  background-color: #07c160;
  color: #fff;
}
.snapshot-footer {
  display: flex;
}
.snapshot-footer-desc {
  flex: 1;
  text-align: left;
  padding-left: 10px;
}

.line {
  display: flex;
  flex-direction: row;
  margin-left: -16px;
  margin-right: -16px;
}
.real-line {
  width: 90%;
  border-bottom: solid 3px rgba(255, 255, 255, 0.1);
  margin: 0 10px 10px 10px;
}
.left-line {
  width: 10px;
  height: 20px;
  background-color: rgba(255, 255, 255, 0.7);
  border-radius: 0 10px 10px 0; 
}
.right-line {
  width: 10px;
  height: 20px;
  background-color: rgba(255, 255, 255, 0.7);
  border-radius: 10px 0 0 10px; 
}

.qrcode {
  display: flex;
  justify-content: center;
  padding: 10px 0;
}
.qrcode image{
  border-radius: 50%;
  width: 80px;
  height: 80px;
}
.qrcode text {
  font-size: 10px;
  color: #fff;
}

index.js

js 复制代码
const app = getApp()

Page({
  data: {

  },
  onLoad() {
    console.log('代码片段是一种迷你、可分享的小程序或小游戏项目,可用于分享小程序和小游戏的开发经验、展示组件和 API 的使用、复现开发问题和 Bug 等。可点击以下链接查看代码片段的详细文档:')
    console.log('https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/devtools.html')
    wx.loadFontFace({
      family: "Monaco",
      source: 'url("https://fonts.cdnfonts.com/s/14106/Monaco.woff")',
      scopes: ['webview', 'native'],
      success: (res) => {
          console.log('success', res.status)
          this.render()
      },
      fail: function (res) {
          console.error(res)
      },
      complete(res) {
        console.log('111', res)
      }
    });
  },

  tap() {
    wx.loadFontFace({
      family: "Monaco",
      source: 'url("https://fonts.cdnfonts.com/s/14106/Monaco.woff")',
      scopes: ['webview', 'native'],
      success: (res) => {
          console.log('success', res.status)
          this.render()
      },
      fail: function (res) {
          console.error(res)
      },
      complete(res) {
        console.log('111', res)
      }
    });
    let isCanUse= wx.canIUse('Snapshot.takeSnapshot');//基础库 3.0.1 开始支持
    if(!isCanUse){
      console.log("不可以使用");
      return;
    }
    this.createSelectorQuery().select("#view")
      .node().exec(res => {
        console.log(res);
        const node = res[0].node
        node.takeSnapshot({
          // type: 'file' 且 format: 'png' 时,可直接导出成临时文件
          type: 'arraybuffer',
          format: 'png',
          success: (res) => {
            const f = `${wx.env.USER_DATA_PATH}/hello.png`
            const fs = wx.getFileSystemManager();
            fs.writeFileSync(f, res.data, 'binary')
            wx.showToast({
              title: '保存成功'
            })

            wx.saveImageToPhotosAlbum({
              filePath: f,
              complete(res) {
                console.log("saveImageToPhotosAlbum:", res)
              }
            })
          },
          fail(res) {
            console.log("takeSnapshot fail:", res)
          }
        })
      })
  }
})

测试

点击保存海报

导出结果

总结

使用skyline的snapshot导出将小程序页面直接导出为图片,大大节省了服务器端的压力,而且样式前端可控,就是需要开启skyline,如果是老项目的话需要webview升级skyline

相关推荐
考拉讲支付6 小时前
母婴亲子服务平台分账架构设计:多场景多方分账与合规清结算实践
大数据·运维·人工智能·微信小程序·架构·微信公众平台
拖孩6 小时前
AI 帮我写的小程序「厨菜记」上线满月了,挣了两百块!!!
前端·后端·微信小程序
喵喵虫7 小时前
汉字笔顺笔画元数据导出 JSON
小程序·json·元数据·汉字·笔顺·笔画
seconp8 小时前
计算机毕设做什么项目?整理了 80 个 Web、小程序、AI 与数据方向
前端·小程序·课程设计
程序员小孔.10 小时前
基于 SpringBoot + UniApp + Vue 的家政服务系统设计与实现
前端·数据库·spring boot·python·docker·微信小程序
万岳科技程序员小金1 天前
直播电商带货系统源码、小程序/APP开发:平台搭建方案全面解析
小程序·私域直播小程序·私域直播软件开发·私域直播app·直播电商系统源码·直播电商平台搭建
IT研究室1 天前
最新计算机毕业设计选题推荐-基于微信小程序的汉服交易系统-网站-文档指导-Java-springboot
java·微信小程序·课程设计
2301_32241428041 天前
springboot学生课堂出勤统计系统15835-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·mysql·随机森林·微信小程序·uni-app·微信开发者工具·推荐算法
小蒜学长2 天前
微信小程序-高校自习室管理系统(代码+数据库+LW)
java·spring boot·后端·微信小程序·自习室管理
上海秉坤2 天前
小程序如何打通门店?预约、券码核销与会员服务记录的流程设计
小程序·零售