uniapp 截图或者生成海报

news2024/11/24 4:07:28

需求:uniapp移动端需要生成一张当前界面的海报

方案一:类似于手机按钮截图效果。实现代码如下:

doSaveScreen() {
                let $this = this;
                uni.showLoading({ //加载框
                    title: '保存中...',
                    mask: true
                })
                var pages = getCurrentPages(); //获取当前页面信息
                var page = pages[pages.length - 1];
                var bitmap = null;
                // $this.$nextTick(()=> {
                var currentWebview = page.$getAppWebview();
                bitmap = new plus.nativeObj.Bitmap('amway_img');
                // 将webview内容绘制到Bitmap对象中
                currentWebview.draw(bitmap, function() {
                    // console.log('截屏绘制图片成功');
                    //这里我将文件名用四位随机数拼接了,不然会出现当前图片替换上一张图片只能保存一张图片的问题
                    let rand = Math.floor(Math.random() * 10000)
                    let saveUrl = '_doc/' + rand + 'a.jpg'
                    bitmap.save(saveUrl, {}, function(i) {
                        uni.saveImageToPhotosAlbum({
                            filePath: i.target,
                            success: function() {
                                // bitmap.clear(); //销毁Bitmap图片
                                uni.showToast({
                                    title: '保存到相册成功',
                                    duration: 1500
                                });
                            },
                            complete() {
                                uni.hideLoading();
                            }
                        });
                    }, function(e) {
                        console.log('保存图片失败:' + JSON.stringify(e));
                    });
                }, function(e) {
                    console.log('保存图片失败:' + JSON.stringify(e));
                });
                // })
            }

上面的发案有两个缺陷:

1.无法保存长图:遇到内容过长,超出了手机屏幕高度(需要上下滚动屏幕才能浏览完所有内容)

2.截图内容不能去掉手机顶部的导航栏;

方案二:使用html2canvas实现。同时解决上面两个缺陷。(不过此方案生成的海报内容有需要显示图片的情况下,需要把图片转成base64给image标签,详情请查看下面的代码。

在项目的根目录下安装html2canvas: npm install html2canvas。

封装成插件方便后续使用,以下是插件代码:

<template>
    <view>
        <view class="html2canvas" :prop="domId" :change:prop="html2canvas.create">
            <slot></slot>
        </view>
    </view>
</template>

<script>
    export default {
        props: {
            domId: {
                type: String,
                required: true
            }
        },
        methods: {
            async renderFinish(base64) {
                try{
                    this.$emit('renderFinish', base64);
                }catch(e){
                    //TODO handle the exception
                    console.log('html2canvas error', e)
                }
            },
            showLoading() {
                // uni.showToast({
                //     title: "正在生成海报",
                //     icon: "none",
                //     mask: true,
                //     duration: 100000
                // })
            },
            hideLoading() {
                //uni.hideToast();
            }
        }
    }
</script>

<script module="html2canvas" lang="renderjs">
import html2canvas from 'html2canvas';
export default {
    methods: {
        async create(domId) {
            if(!domId){
                return;
            }
            try {
                this.$ownerInstance.callMethod('showLoading', true);
                const timeout = setTimeout(async ()=> {
                    const shareContent = document.querySelector(domId);
                    const canvas = await html2canvas(shareContent,{
                        width: shareContent.offsetWidth,//设置canvas尺寸与所截图尺寸相同,防止白边
                        height: shareContent.offsetHeight,//防止白边
                        logging: true,
                        useCORS: true,
                        allowTaint: true,
                    });
                    
                    const base64 = canvas.toDataURL('image/jpeg', 1);
                    this.$ownerInstance.callMethod('renderFinish', base64);
                    this.$ownerInstance.callMethod('hideLoading', true);
                    clearTimeout(timeout);
                }, 1300);
            } catch(error){
                console.log(error)
            }
        }
    }
}
</script>


<style lang="scss">

</style>

使用代码如下:

     urlToBase64Qrcode(url){
                if(url){
                    uni.request({
                        url:url,
                        method:'GET',
                        responseType:'arraybuffer',
                        success: ( res)=> {
                            let base64 = wx.arrayBufferToBase64(res.data);
                            let Base64Url = 'data:image/jpeg;base64,' + base64;
                            this.base64Qrcode = Base64Url;
                        }
                    })
                }
            },
            urlToBase64UserHead(url){
                if(url){
                    uni.request({
                        url:url,
                        method:'GET',
                        responseType:'arraybuffer',
                        success: ( res)=> {
                            let base64 = wx.arrayBufferToBase64(res.data);
                            let Base64Url = 'data:image/jpeg;base64,' + base64;
                            this.base64Head = Base64Url;
                        }
                    })
                }
            },
        
            renderFinish(base64) {
                this.imageData = base64;
            },
            saveImageToLocal() {
                if (!this.imageData) {
                    uni.showToast({
                        title: '保存失败',
                        icon: 'none'
                    })
                    return;
                }
                const bitmap = new plus.nativeObj.Bitmap("test")
                bitmap.loadBase64Data(this.imageData, function() {
                    const url = "_doc/" + new Date().getTime() + ".png"; // url为时间戳命名方式
                    bitmap.save(url, {
                        overwrite: true, // 是否覆盖
                        // quality: 'quality'  // 图片清晰度
                    }, (i) => {
                        uni.saveImageToPhotosAlbum({
                            filePath: url,
                            success: function() {
                                uni.showToast({
                                    title: '保存成功',
                                    icon: 'none'
                                })
                                bitmap.clear()
                            }
                        });
                    }, (e) => {
                        console.log(e);
                        uni.showToast({
                            title: '图片保存失败',
                            icon: 'none'
                        })
                        bitmap.clear()
                    });
                }, (e) => {
                    
                    uni.showToast({
                        title: '图片保存失败',
                        icon: 'none'
                    })
                    bitmap.clear()
                })
            },


 

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

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

相关文章

Sqlmap手册—史上最全

Sqlmap手册—史上最全 一.介绍 开源的SQL注入漏洞检测的工具&#xff0c;能够检测动态页面中的get/post参数&#xff0c;cookie&#xff0c;http头&#xff0c;还能够查看数据&#xff0c;文件系统访问&#xff0c;甚至能够操作系统命令执行。 检测方式&#xff1a;布尔盲注、…

css中的background属性

文章目录 一&#xff1a;background-repeat二&#xff1a;background-position三&#xff1a;background缩写方式三&#xff1a;background-size四&#xff1a;background-origin五&#xff1a;background-clip 在日常前端开发中&#xff0c;经常需要进行背景或背景图的处理。但…

国民技术N32G430开发笔记(10)- IAP升级 Application 的制作

IAP升级 Application 的制作 1、App程序跟Bootloader程序最大的区别就是&#xff0c; 程序的执行地址变成了之前flash设定的0x08006000处&#xff0c; 大小限制为20KB 所以修改Application工程的ld文件 origin 改成 0x08006000 length 改成0x5000 烧录是起始地址也要改为x0x…

【chapter30】【PyTorch】[动量与学习率衰减】

前言&#xff1a; SGD的不足&#xff1a; ①呈“之”字型&#xff0c;迂回前进&#xff0c;损失函数值在一些维度的改变得快&#xff08;更新速度快&#xff09;&#xff0c;在一些维度改变得慢&#xff08;速度慢&#xff09;- 在高维空间更加普遍 ②容易陷入局部极小值和鞍点…

JVM性能调优监控工具jps、jstack、jmap、jhat、jstat

JDK本身提供了很多方便的JVM性能调优监控工具&#xff0c;除了集成式的VisualVM和jConsole外&#xff0c;还有jps、jstack、jmap、jhat、jstat等小巧的工具&#xff0c;本博客希望能起抛砖引玉之用&#xff0c;让大家能开始对JVM性能调优的常用工具有所了解。 现实企业级Java开…

【数据架构系列-06】一文搞懂数据模型的3中类型——概念模型、逻辑模型、物理模型

数据模型就是模拟现实世界的方法论&#xff0c;是通向智慧世界的基石&#xff01; 从现实世界发展到智慧世界&#xff0c;要数经历现实世界、信息世界、计算机世界、数据世界、智慧世界五个不同的世界&#xff0c;我们天生具有从混沌的世界抽象信息变为信息世界的能力&#xff…

《统计学习方法》——EM算法及其推广(上)

引言 EM算法是一种迭代算法&#xff0c;用于含有隐变量的概率模型参数的极大似然估计。 理解EM算法需要很多概率论的知识&#xff0c;所以下面先贴出所需要的知识。便于对后文的理解。 补充知识 期望 对于离散型随机变量 X X X的概率分布为 p i p { X x i } p_ip\{Xx_i\}…

第八章 集合函数

文章目录 前言一、聚合函数介绍1 、AVG (平均值) 和SUM &#xff08;求和&#xff09;函数2 、MIN&#xff08;最小值&#xff09;和MAX&#xff08;最大值&#xff09;函数3 、COUNT函数问题&#xff1a;用count(*)&#xff0c;count(1)&#xff0c;count(列名)谁好呢? 二、G…

语义分割学习笔记(一)语义分割前言

1.什么是语义分割&#xff1f; 语义分割(semantic segmentation) FCN要对分割对象进行一个大的划分&#xff0c;即分类。如下图&#xff0c;语义分割有树、人、草地大类别的划分。 实例分割(Instance segmentation) Mask R-CNN要对每一个分割类别中的每一个对象也要进行一个细…

第五章——动态规划2

线性DP 数字三角形 像二维数组一样&#xff0c;设置行和列&#xff0c;只不过这里的列是斜着的&#xff0c;如圈出来的7&#xff0c;坐标可以表示为(4,2) 集合划分&#xff0c;所有路径可以分成俩类&#xff0c;某点左上方一类&#xff0c;右下方一类。 我们先把7去掉&#xff…

利用层级式一致性加强进行半监督病理图像分割

文章目录 Semi-supervised Histological Image Segmentation via Hierarchical Consistency Enforcement摘要方法对学生模型进行有监督学习层级式一致性强化模块Hierarchical Consistency Loss (HC-Loss)以自我为导向的分层一致性损失 实验结果 Semi-supervised Histological I…

MySQL基础概念和SQL

目录 1.概念 1.1.什么是MySQL 1.2.关系型数据库、非关系型数据库 1.3.库、表、字段 2.数据类型 2.1.数值 2.2.字符串 2.3.日期/时间 3.结构化查询语言 3.1.DDL 3.2.DML 3.3.DCL 3.4.DQL 3.4.1.结果集 3.4.2.取别名 3.4.3.查列 3.4.4.条件查询 3.4.5.模糊查询…

做BI财务数据分析,国产BI软件经验更足

不管是为了提高销售额&#xff0c;还是为了提高库存周转、疏通现金流&#xff0c;都离不开数据分析&#xff0c;特别是BI大数据分析可视化。因此这几年来BI软件在各行各业的接受度迅速提升&#xff0c;特别是在财务数据分析方面&#xff0c;国产BI软件更是经验、技术到位。要说…

【大数据之Hadoop】二十二、Yarn调度器和调度算法

Hadoop作业调度器主要有三种&#xff1a;FIFO、容量&#xff08;Capacity Scheduler&#xff09;和公平&#xff08;Fair Scheduler&#xff09;。 Apache Hadoop默认的资源调度器&#xff1a;容量调度器Capacity Scheduler。 CDH框架默认调度器是Fair Scheduler。 1 FIFO 单…

智能电动自行车充电远程管理系统

目前市场上现有的户外普通充电桩只是一个用电计量工具&#xff0c;无法形成一个有效的停放充电管理环境。在受到雨、雪、风、暴晒等天气影响下根本无法使用,并且存在极大的安全隐患。同时公共无限的停放也导致充电位置被闲置车辆及杂物堆放占用&#xff0c;经常出现真正需要充电…

前端面试题 —— CSS (二)

目录 一、transition 和 animation 的区别 二、什么是物理像素&#xff0c;逻辑像素和像素密度&#xff0c;为什么在移动端开发时需要用到3x, 2x 这种图片&#xff1f; 三、margin 和 padding 的使用场景 四、CSS 优化和提高性能的方法有哪些&#xff1f; 五、display:in…

大数据编程实验3 熟悉常用的HBase操作

实验:熟悉常用的HBase操作 1实验目的 理解HBase在Hadoop体系结构中的角色&#xff1b;熟练使用HBase操作常用的Shell命令&#xff1b; 2 实验平台 操作系统&#xff1a;Linux Hadoop版本&#xff1a;3.1.3 HBase版本&#xff1a;2.2.2 JDK版本&#xff1a;1.8 3 实验内容和…

KDJB-702继保综合检测试验仪

一、产品参数 交流电流输出 输出精度&#xff1a;≤0.5A 2mA &#xff1e;0.5A 0.2% 相电流输出&#xff08;有效值&#xff09;&#xff1a;0&#xff5e;30A 三并电流输出&#xff08;有效值&#xff09;&#xff1a;0&#xff5e;900A 相电流长时间允许工作值&#xff…

java开发的chatGPT机器人系统

ChatGPT机器人发展趋势&#xff1a; 更加个性化&#xff1a;随着数据和技术的不断进步&#xff0c;ChatGPT机器人将能够更加准确地理解用户的需求和偏好&#xff0c;并提供更加个性化的回复和服务。 多语言支持&#xff1a;随着ChatGPT在各个国家和地区的普及&#xff…

uniapp(vue2)封装子组件

创建子组件 在项目根目录下新建 components 目录&#xff0c;右键选择“新建组件”&#xff0c;创建子组件&#xff08;这里以 search.vue 举例&#xff09;并且为同名目录&#xff0c;即 components --> search --> search.vue&#xff0c;这样父组件可以直接使用&…