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

news2025/4/22 17:20:34

<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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2340246.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Office文件内容提取 | 获取Word文件内容 |Javascript提取PDF文字内容 |PPT文档文字内容提取

关于Office系列文件文字内容的提取 本文主要通过接口的方式获取Office文件和PDF、OFD文件的文字内容。适用于需要获取Word、OFD、PDF、PPT等文件内容的提取实现。例如在线文字统计以及论文文字内容的提取。 一、提取Word及WPS文档的文字内容。 支持以下文件格式&#xff1a; …

HXBC编译相关错误

0、Keil MDK报错:Browse information of one or more files is not available----解决方法: 1、使用cubemax生成的工程中,某些引脚自定义了的,是在main.h中,要记得移植。 注意:cubemax生成的spi.c后,在移植的时候,注意hal_driver下面要对应增加hal_stm32H7xxxspi.c …

运维概述(linux 系统)

1、运维的基本概念 2、企业的运行模式 3、计算机硬件 运维概述 运维岗位的定义 在技术人员&#xff08;写代码的&#xff09;之间&#xff0c;一致对运维有一个开玩笑的认知&#xff1a;运维就是修电脑的、装网线的、背锅的岗位。 IT运维管理是指为了保障企业IT系统及网络…

C语言 数据结构 【堆】动态模拟实现,堆排序,TOP-K问题

引言 堆的各个接口的实现&#xff08;以代码注释为主&#xff09;&#xff0c;实现堆排序&#xff0c;解决经典问题&#xff1a;TOP-K问题 一、堆的概念与结构 堆 具有以下性质 • 堆中某个结点的值总是不大于或不小于其父结点的值&#xff1b; • 堆总是一棵完全二叉树。 二…

模型加载常见问题

safetensors_rust.SafetensorError: Error while deserializing header: HeaderTooLarge 问题代码&#xff1a; model AutoModelForVision2Seq.from_pretrained( "/data-nvme/yang/Qwen2.5-VL-32B-Instruct", trust_remote_codeTrue, torch_dtypetorc…

PyTorch 深度学习实战(37):分布式训练(DP/DDP/Deepspeed)实战

在上一篇文章中&#xff0c;我们探讨了混合精度训练与梯度缩放技术。本文将深入介绍分布式训练的三种主流方法&#xff1a;Data Parallel (DP)、Distributed Data Parallel (DDP) 和 DeepSpeed&#xff0c;帮助您掌握大规模模型训练的关键技术。我们将使用PyTorch在CIFAR-10分类…

微信小程序通过mqtt控制esp32

目录 1.注册巴法云 2.设备连接mqtt 3.微信小程序 备注 本文esp32用的是MicroPython固件&#xff0c;MQTT服务用的是巴法云。 本文参考巴法云官方教程&#xff1a;https://bemfa.blog.csdn.net/article/details/115282152 1.注册巴法云 注册登陆并新建一个topic&#xff…

1.Vue3 - 创建Vue3工程

目录 一、 基于vue-cli 脚手架二、基于vite 推荐2.1 介绍2.2 创建项目2.3 文件介绍2.3.1 extensions.json2.3.2 脚手架的根目录2.3.3 主要文件 src2.3.3.1 main.js2.3.3.2 App.vue 组件2.3.3.3 conponents 2.3.4 env.d.ts2.3.5 index.html 入口文件2.3.6 package2.3.7 tsconfig…

AI编写的“黑科技风格、自动刷新”的看板页面

以下的 index.html 、 script.js 和 styles.css 文件&#xff0c;实现一个具有黑科技风格、自动刷新的能源管理系统实时监控看板。 html页面 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name&q…

11-DevOps-Jenkins Pipeline流水线作业

前面已经完成了&#xff0c;通过在Jenkins中创建自由风格的工程&#xff0c;在界面上的配置&#xff0c;完成了发布、构建的过程。 这种方式的缺点就是如果要在另一台机器上进行同样的配置&#xff0c;需要一项一项去填写&#xff0c;不方便迁移&#xff0c;操作比较麻烦。 解…

【JavaWeb后端开发03】MySQL入门

文章目录 1. 前言1.1 引言1.2 相关概念 2. MySQL概述2.1 安装2.2 连接2.2.1 介绍2.2.2 企业使用方式(了解) 2.3 数据模型2.3.1 **关系型数据库&#xff08;RDBMS&#xff09;**2.3.2 数据模型 3. SQL语句3.1 DDL语句3.1.1 数据库操作3.1.1.1 查询数据库3.1.1.2 创建数据库3.1.1…

Github 热点项目 Jumpserver开源堡垒机让服务器管理效率翻倍

Jumpserver今日喜提160星&#xff0c;总星飙至2.6万&#xff01;这个开源堡垒机有三大亮点&#xff1a;① 像哆啦A梦的口袋&#xff0c;支持多云服务器一站式管理&#xff1b;② 安全审计功能超硬核&#xff0c;操作记录随时可回放&#xff1b;③ 网页终端无需装插件&#xff0…

第七届传智杯全国IT技能大赛程序设计赛道 国赛(总决赛)—— (B组)题解

1.小苯的木棍切割 【解析】首先我们先对数列排序&#xff0c;找到其中最小的数&#xff0c;那么我们就保证了对于任意一个第i1个的值都会大于第i个的值那么第i2个的值也比第i个大&#xff0c;那么我们第i1次切木棍的时候一定会当第i个的值就变为了0的&#xff0c;第i1减去的应该…

Netty前置基础知识之BIO、NIO以及AIO理论详细解析和实战案例

前言 Netty是什么&#xff1f; Netty 是一个基于 Java 的 ​高性能异步事件驱动网络应用框架&#xff0c;主要用于快速开发可维护的协议服务器和客户端。它简化了网络编程的复杂性&#xff0c;特别适合构建需要处理海量并发连接、低延迟和高吞吐量的分布式系统。 1)Netty 是…

开源身份和访问管理(IAM)解决方案:Keycloak

一、Keycloak介绍 1、什么是 Keycloak&#xff1f; Keycloak 是一个开源的身份和访问管理&#xff08;Identity and Access Management - IAM&#xff09;解决方案。它旨在为现代应用程序和服务提供安全保障&#xff0c;简化身份验证和授权过程。Keycloak 提供了集中式的用户…

深入理解 TCP 协议 | 流量、拥塞及错误控制机制

注&#xff1a;本文为 “TCP 协议” 相关文章合辑。 原文为繁体&#xff0c;注意术语描述差异。 略作重排&#xff0c;如有内容异常&#xff0c;请看原文。 作者在不同的文章中互相引用其不同文章&#xff0c;一并汇总于此。 可从本文右侧目录直达本文主题相关的部分&#xff…

VSCode远程图形化GDB

VSCode远程图形化GDB 摘要一、安装VSCode1、使用.exe安装包安装VSCode2、VSCode 插件安装3、VSCode建立远程连接 二、core dump找bug1、开启core文件2、永久生效的方法3、编写测试程序4、运行结果5、查看core段错误位置6、在程序中开启core dump并二者core文件大小 三、gdbserv…

软件工程师中级考试-上午知识点总结(上)

我总结的这些都是每年的考点&#xff0c;必须要记下来的。 1. 计算机系统基础 1.1 码 符号位0表示正数&#xff0c;符号位1表示负数。补码&#xff1a;简化运算部件的设计&#xff0c;最适合进行数字加减运算。移码&#xff1a;与前几种不同&#xff0c;1表示&#xff0c;0表…

基于FreeRTOS和STM32的微波炉

一、项目简介 使用STM32F103C8T6、舵机、继电器、加热片、蜂鸣器、两个按键、LCD及DHT11传感器等硬件。进一步&#xff0c;结合FreeRTOS和状态机等软件实现了一个微波炉系统&#xff1b;实现的功能包含&#xff1a;人机交互、时间及功率设置、异常情况处理及固件升级等。 二、…

国防科大清华城市空间无人机导航推理!GeoNav:赋予多模态大模型地理空间推理能力,实现语言指令导向的空中目标导航

作者&#xff1a; Haotian Xu 1 ^{1} 1, Yue Hu 1 ^{1} 1, Chen Gao 2 ^{2} 2, Zhengqiu Zhu 1 ^{1} 1, Yong Zhao 1 ^{1} 1, Yong Li 2 ^{2} 2, Quanjun Yin 1 ^{1} 1单位&#xff1a; 1 ^{1} 1国防科技大学系统工程学院&#xff0c; 2 ^{2} 2清华大学论文标题&#xff1a;Geo…