uniapp APP端 DOM生成图片保存到相册

<template>

<view class="container" style="padding-bottom: 30rpx;">

<view class="hdbg pr w100 " style="height: 150rpx;">

<top-bar content='分享' @Back="Back"></top-bar>

</view>

<view id="capture" class="page-body">

<view class="fx">

<image :src="list.image_base" mode="" crossorigin="anonymous"></image>

</view>

<view class="cred-arr">

<view class="cred">

<view class="erweim">

<image :src="list.qrcode" mode=""></image>

</view>

<!-- <view class="fs28 smwb smt">扫码下载APP</view> -->

</view>

</view>

</view>

<view class="page-foot flex justify-center pt30">

<view class="butten_left mr30" @click="generateImage">分享海报</view>

<view class="butten_right" @click="onshare">分享链接</view>

</view>

<canvas canvas-id="shareCanvas"

style="width: 750rpx; height: 1334rpx; position: fixed; left: -9999rpx;"></canvas>

</view>

</template>

<script>

import html2canvas from 'html2canvas';

export default {

data() {

return {

list: {},

canvasWidth: 355,

canvasHeight: 600

}

},

onLoad() {

this.getlist()

},

methods: {

Back() {

uni.navigateBack()

},

getlist() {

this.https('xxxxxxx', 'Post').then((res) => {

console.log(res)

this.list = res

})

},

onshare() {

uni.setClipboardData({

data: this.list.url,

success: function() {

uni.showToast({

title: '复制链接成功',

icon: 'none',

duration: 2000

});

},

fail: function() {

console.log('复制失败');

}

});

},

async generateImage() {

// #ifdef APP

const ctx = uni.createCanvasContext('shareCanvas', this);

// 绘制背景

ctx.save();

ctx.drawImage(this.list.image_base, 0, 0, this.canvasWidth, this.canvasHeight);

ctx.restore();

// 绘制二维码

ctx.save();

const qrCodeSize = 160;

const qrCodeX = (this.canvasWidth - qrCodeSize) / 2;

const qrCodeY = this.canvasHeight - 240;

ctx.drawImage(this.list.qrcode, qrCodeX, qrCodeY, qrCodeSize, qrCodeSize);

ctx.restore();

// 绘制完成

ctx.draw(false, () => {

// 将canvas转换为图片

uni.canvasToTempFilePath({

canvasId: 'shareCanvas',

success: (res) => {

// 保存图片到相册

uni.saveImageToPhotosAlbum({

filePath: res.tempFilePath,

success: () => {

uni.showToast({

title: '保存成功',

icon: 'success'

});

},

fail: () => {

uni.showToast({

title: '保存失败',

icon: 'none'

});

}

});

},

fail: (err) => {

console.log('生成图片失败', err);

uni.showToast({

title: '生成图片失败',

icon: 'none'

});

}

}, this);

});

// #endif

// #ifndef APP

const element = document.getElementById('capture')

console.log(element)

html2canvas(element).then((canvas) => {

console.log(canvas)

const imagedata = canvas.toDataURL('image/png')

const link = document.createElement('a');

link.href = imagedata;

link.download = 'filename.png'; // 设置下载文件名

link.click(); // 触发下载

uni.showToast({

title: '下载海报成功',

icon: 'none',

duration: 2000

});

})

// #endif

}

}

}

</script>

<style>

.container {

width: 100%;

min-height: 100vh;

background-color: #f5f5f5;

}

.page-body {

width: 100%;

padding: 30rpx;

box-sizing: border-box;

position: relative;

}

.fx {

width: 100%;

margin-bottom: 30rpx;

}

.fx image {

width: 100%;

height: 1226rpx;

}

.cred-arr {

width: calc(100% - 60rpx);

display: flex;

justify-content: center;

position: absolute;

bottom: 260rpx;

}

.cred {

text-align: center;

}

.erweim {

width: 300rpx;

height: 300rpx;

margin: 0 auto;

}

.erweim image {

width: 100%;

height: 100%;

}

.page-foot {

width: 100%;

height: 158rpx;

background-color: #fff;

box-shadow: 0rpx 2rpx 14rpx 6rpx rgba(0,0,0,0.08);

margin-top: 30rpx;

}

.butten_left,

.butten_right {

width: 300rpx;

height: 80rpx;

line-height: 80rpx;

text-align: center;

border-radius: 40rpx;

font-size: 28rpx;

}

.butten_left {

background-color: #ff6b6b;

color: #fff;

}

.butten_right {

background-color: #4CAF50;

color: #fff;

}

</style>

相关推荐
码间留白1 天前
六轮真机实验后,我把鸿蒙直播推流的 UI 全逼成了原生——uni-app 适配 HarmonyOS NEXT 完整复盘
uni-app·鸿蒙·harmonyos next·直播推流·arkts/arkui
wuxianda10303 天前
2026 苹果审核 4.3 (a) 被拒全解析|Guideline 4.3a spam 马甲包拒审原因 + 避坑方案
flutter·uni-app·苹果上架
头发还在的女程序员4 天前
基于 Spring Boot + Vue 3 + uni-app 的灵活用工系统:四端架构与业务流程设计
vue.js·spring boot·uni-app·灵活用工·灵工系统
Dumbness6 天前
订阅消息弹窗必须在用户点击里调:联调实验室里 timing 和 Mock 支付通知踩的坑
javascript·uni-app
码间留白7 天前
uni-app 鸿蒙离线打包:一个改动从源码到真机要穿过几条链
uni-app·鸿蒙·deveco·离线打包·uts插件
多客:duokelijie8 天前
代练订单系统选型思路:跨品类游戏接入、订单分层管理、自动结算逻辑拆解!
数据库·mysql·微信小程序·前端框架·uni-app·php·持续部署
码间留白8 天前
鸿蒙端对接 BLE 血压计:从一次握手到读数入库(二)设备篇
物联网·uni-app·鸿蒙·蓝牙ble·血压计
华玥作者9 天前
Vue 3 + TypeScript + uni-app 组件库推荐:hy-app(华玥组件库)
vue.js·typescript·uni-app
FinelyYang9 天前
uniapp使用kkfileview在线预览ppt,excel,word,pdf类型文件
pdf·uni-app·powerpoint
2501_916008899 天前
iPhone 设备信息查看,用 KeyMob 看型号、序列号、电池健康和 UDID
android·ios·小程序·https·uni-app·iphone·webview