首页 > 其他分享 >前端合成海报并保存到本地

前端合成海报并保存到本地

时间:2023-08-16 14:38:51浏览次数:31  
标签:海报 success 前端 ctx canvas 本地 图片 下载 wx

近期给AI产品增加了推广返佣的能力,涉及到推广就会有分享裂变,个人的专属分享链接及海报。本次文章主要记录前端合成海报并下载到本地的流程,因为产品运行的平台主要是在小程序和PC浏览器,所以主要也是实现这两个平台的图片下载,接下来开始正文。

浏览器端实现

在实现下载之前首先要将海报内容合并成一张图片。这里用到了 html2canvas 这个库,这个相信很多人都有用到过。

html2canvas可以将网页中的HTML元素转换为Canvas图像,从而实现将网页内容截图的功能。它提供了一种简单的方法来捕捉整个网页或特定的HTML元素,并生成对应的图像数据。

以下是一个简单的示例代码,第一个参数传入需要合并图像的DOM根元素,第二个参数传入相应的参数配置,在回调中即可获取到对应的canvas对象:

html2canvas(this.$refs.poster.$el, {
    useCORS: true,
    allowTaint: true,
    scale: this.getDPR(),
}).then(canvas => {})

接下来就是将canvas对象转换成图片并下载到本地,通过canvas.toDataURL可以将canvas对象转换为base64的图片地址,再创建一个a标签模拟点击即可触发图片下载到本地。

const dataURL = canvas.toDataURL('image/jpeg', 0.8);
const link = document.createElement('a');
link.href = dataURL;
link.download = 'poster.png';
// 模拟点击链接,触发下载
link.click();

小程序端实现

小程序实现就较为麻烦一些了,html2canvas在小程序里面不支持,可以使用wxml-to-canvas 代替,但是考虑到接入的成本和当前实现的页面比较简单,目前实现是直接用原生canvas绘制海报,大概的代码如下所示,主要就是绘制图片及文本,如果涉及到比较复杂的界面对应的代码复杂度也会升高很多,大家如果有更好的方案欢迎讨论。

const ctx = wx.createCanvasContext('canvas');
ctx.beginPath();
ctx.drawImage('bg.png', 0, 0, this.canvasWidth, this.canvasHeight);
ctx.setTextAlign('center');
ctx.setFillStyle('#FFFFFF');
ctx.setFontSize(24);
ctx.fillText('海报文本', 150, uni.upx2px(90));
ctx.draw();

图片绘制好了接下来就是下载的过程。

在小程序里面下载图片需要用到 wx.canvasToTempFilePath,把当前画布指定区域的内容导出生成指定大小的图片,这里我们传入对应的cavansID即可,在成功的回调中就能获取到图片的临时文件路径 (本地路径)。

wx.canvasToTempFilePath({
  canvasId: 'poster-canvas',
  success(res) {
      const tempFilePath = res.tempFilePath
  }
})

获取到了本地地址就可以进行图片的保存,但是可能存在用户未设置权限或拒绝了存储到权限,所以下载之前需要进行权限相关的判断及提示引导操作。大概的代码如下:

// 判断用户授权
wx.getSetting({
    success(res) {
        // 没有权限,发起授权
        if (!res.authSetting['scope.writePhotosAlbum']) {
            wx.authorize({
                scope: 'scope.writePhotosAlbum',
                success() {
                    // 授权成功,可下载
                },
                fail() {
                    // 用户点击拒绝授权,跳转到设置页,引导用户授权
                    wx.openSetting({
                        success() {
                            wx.authorize({
                                scope: 'scope.writePhotosAlbum',
                                success() {
                                    // 可下载
                                },
                                fail() {
                                    this.$showToast("保存失败");
                                }
                            })
                        },
                        fail(res) {
                            this.$showToast("未获得权限保存图片");
                        }
                    })
                }
            })
        } else {
            // 用户已授权,可下载保存到相册
        }
    }
})

权限判断没问题即可调用wx.saveImageToPhotosAlbum传入前面从canvasToTempFilePath获取的tempFilePath进行下载:

wx.saveImageToPhotosAlbum({
  filePath,
  success() {
      // 保存成功
  },
  fail() {
      // 保存失败
  }
})

最后

在浏览器和小程序中保存图片的过程到此就结束了,可能在不同的设备或DOM元素会存在一定的兼容性,本次主要分享核心的实现逻辑,大家有遇到什么坑欢迎留言讨论~

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

专注前端开发,分享前端相关技术干货,公众号:南城大前端(ID: nanchengfe)

标签:海报,success,前端,ctx,canvas,本地,图片,下载,wx
From: https://blog.51cto.com/react/7107280

相关文章

  • Windows上使用FFmpeg实现本地视频推送模拟海康协议rtsp视频流
    场景Nginx搭建RTMP服务器+FFmpeg实现海康威视摄像头预览:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/121202130上面记录的是使用FFmpeg拉取海康协议摄像头的rtsp流并推流到流媒体服务器。如果在其它业务场景下需要本地的视频文件模拟海康的rtsp流协议格式进行......
  • 拉去springboot 项目时java8 本地时java11 时idea编译不通过
    解决方法:1、 2、 3、 ......
  • 小程序自动发版探索,两个优秀的第三方库该如何选择?且听我娓娓道来【玩转前端】
    前情提要目前的多端项目,在代码发布的时候,对于不同的端,需要进行不同的操作。尤其小程序端,每次都要在开发者工具中进行一次:上传->填写版本信息->提交审核(确定上线时)既然手动这么麻烦,能不能做成自动的?让开发节省重复操作时间,同时避免手动操作遗漏的可能性。我翻阅资料,发现已经有大佬......
  • 【校招VIP】前端vue考点之生命周期和双向绑定
    考点介绍:VUE是前端校招面试的重点,而生命周期和双向绑定又是基础考点之一,尤其在一二线公司,要求知道双向绑定的原理,以及相关代码实现。一、考点题目1、mvvm和mvc区别?它和其它框架(jquery)的区别是什么?哪些场景适合?解答:mvc和mvvm其实区别并不大。都是一种设计思想。主要就是mvc中Co......
  • [LLM] 开源 AI 大语言模型的本地化定制实践
     LLM(LargeLanguageModel,大型语言模型)是一种基于深度学习的自然语言处理模型,旨在理解和生成人类语言。它们在大量的文本数据上进行训练,可以执行广泛的任务,包括文本总结、翻译、情感分析等等。LLM的特点是规模庞大,包含数十亿的参数,帮助它们学习语言数据中的复杂模式。 本文......
  • 本地搭建spring-boot集成dubbo问题汇总
    1,java.lang.NoClassDefFoundError:com/alibaba/spring/util/PropertySourcesUtils<dependency> <groupId>com.alibaba.spring</groupId> <artifactId>spring-context-support</artifactId> <version>1.0.2</version>......
  • 2023前端JavaScript面试题大全
    一、基础题题目1:什么是JavaScript的数据类型?如何检查一个变量的数据类型?答案:JavaScript有七种数据类型:基本数据类型(PrimitiveDataTypes):Number、String、Boolean、Null、Undefined、Symbol引用数据类型(ReferenceDataTypes):Object、Array要检查一个变量的数据类......
  • 基于花生壳和EMQX搭建本地mqtt服务
    本篇关于搭建本地mqtt调试服务器步骤1:下载相关工具,花生壳以及EMQX开源mqtt服务EMqx下载地址:https://www.emqx.com/zh/try?product=broker花生壳下载地址:https://hsk.oray.com/步骤2:花生壳实现内网穿透在这里不做讲解,主要讲述EMQX相关步骤;emqx开源版本下载,解压后,成功后的界面:浏览......
  • 微信小程序:自动生成打卡海报
    文章目录1前言2界面展示3部分代码展示以及原理解释4结语完整项目下载:下载链接1前言在当前的背单词小程序开发中,为满足用户学习完成后的展示需求,计划引入自动生成打卡海报功能,以提升用户参与度与推广效果。除了基本的海报生成功能,还可以考虑以下丰富内容:将用户的学习数据融入......
  • vue前端项目中遇到的问题以及解决方案-不定时更新
    vue-cli创建vue项目中全局使用mixin首先需要安装插件npminstallstyle-resources-loadervue-cli-plugin-style-resources-loader--save-dev修改vue.config.js文件pluginOptions:{'style-resources-loader':{preProcessor:'scss',patterns:[//......