当前位置: 首页 > article >正文

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>

相关文章:

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-b…...

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

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

算法——背包问题(分类)

背包问题&#xff08;Knapsack Problem&#xff09;是一类经典的组合优化问题&#xff0c;广泛应用于资源分配、投资决策、货物装载等领域。根据约束条件和问题设定的不同&#xff0c;背包问题主要分为以下几种类型&#xff1a; 1. 0-1 背包问题&#xff08;0-1 Knapsack Probl…...

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

Windows 环境下 Apache 配置 WebSocket 支持

目录 前言1. 基本知识2. 实战前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 原先写过apache的http配置:Apache httpd-vhosts.conf 配置详解(附Demo) 1. 基本知识 🔁 WebSocket 是 HTTP 的升级协议 客户…...

运维概述(linux 系统)

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

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

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

MFC文件-写MP4

下载本文件 本文件将创作MP4视频文件代码整合到两个文件中&#xff08;Mp4Writer.h和Mp4Writer.cpp)&#xff0c;将IYUV视频流编码为H264&#xff0c;PCM音频流编码为AAC&#xff0c;写入MP4文件。本文件仅适用于MFC程序。 使用方法 1.创建MFC项目。 2.将Mp4Writer.h和Mp4Wri…...

8.观察者模式:思考与解读

原文地址:观察者模式&#xff1a;思考与解读 更多内容请关注&#xff1a;7.深入思考与解读设计模式 引言 在开发软件时&#xff0c;系统的某些状态可能会发生变化&#xff0c;而你希望这些变化能够自动通知到依赖它们的其他模块。你是否曾经遇到过&#xff0c;系统中某个对象…...

CMake execute_process用法详解

execute_process 是 CMake 中的一个命令&#xff0c;用于在 CMake 配置阶段&#xff08;即运行 cmake 命令时&#xff09;执行外部进程。它与 add_custom_command 或 add_custom_target 不同&#xff0c;后者是在构建阶段&#xff08;如 make 或 ninja&#xff09;执行命令。ex…...

模型加载常见问题

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;操作比较麻烦。 解…...

23种设计模式-结构型模式之外观模式(Java版本)

Java 外观模式&#xff08;Facade Pattern&#xff09;详解 &#x1f9ed; 什么是外观模式&#xff1f; 外观模式是结构型设计模式之一&#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表…...

Python+CoppeliaSim+ZMQ remote API控制机器人跳舞

这是一个使用Python和CoppeliaSim&#xff08;V-REP&#xff09;控制ASTI人型机器人进行舞蹈动作的演示项目。 项目描述 本项目展示了如何使用Python通过ZeroMQ远程API与CoppeliaSim仿真环境进行交互&#xff0c;控制ASTI人型机器人执行预定义的舞蹈动作序列。项目包含完整的机…...

基于FreeRTOS和STM32的微波炉

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

维度建模工具箱 提纲与总结

这里写自定义目录标题 基本概念事实表和维度表BI(Business Intelligence) 产品 事实表事实表的粒度事实表的种类 维度表建模技术基本原则避免用自然键作为维度表的主键&#xff0c;而要使用类似自增的整数键避免过度规范化避免变成形同事实表的维度表 SCD(Slowly Changed Dimen…...

【沉浸式求职学习day21】【常用类分享,完结!】

沉浸式求职学习 String类&#xff08;完结&#xff09; 和 equals的区别 StringBuffer日期类DateCalendar File类 String类&#xff08;完结&#xff09; 上次讲了一些创建String类实例的方法。 今天要分享的第一个点是常考的关于String的面试题 和 equals的区别 首先是&…...

国防科大清华城市空间无人机导航推理!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…...