微信小程序第四篇:生成图片并保存到手机相册

article/2025/11/8 9:01:53

系列文章传送门:

微信小程序第一篇:自定义组件详解

微信小程序第二篇:七种主流通信方法详解

微信小程序第三篇:获取页面节点信息

目录

一、封装分享组件

二、定义用户授权方法

三、调用流程


首先我们看一下要完成的效果:

 

这种场景还是非常常见的,点击分享的时候我们可以转发给好友,或者生成当前页的海报图片保存到手机相册中。分享给好友这个功能可以通过  button 的 open-type 方式实现,那自动保存图片到本地该如何实现呢,让我们来看一看吧:

一、封装分享组件

首先我们要封装一个分享的组件,这样方便在其他的页面中复用。这样就大大减少了代码的冗余,

在 components 文件夹中新建一个组件,下面是完整代码

share.wxml:

<!-- 底部自定义分享菜单栏 -->
<view class="share-sheet-mask flex-column" hidden="{{!showShareSheet}}" catchtap="closeShareSheet"><view class="share-sheet"><view class="items flex-row"><view class="item flex-column"><button class="ico flex-row" open-type="share"><image class="img wx-ico" src="../../images/ico_wx.svg"></image></button><view class="desc">微信好友</view></view><view class="item flex-column"><button class="ico flex-row" catchtap="genPlayBill"><image class="img img-ico" src="../../images/ico_img.svg"></image></button><view class="desc">生成海报</view></view></view><view class="cancel-share-sheet">取消</view></view>
</view>

 share.js:

Component({/*** 组件的属性列表*/properties: {},/*** 组件的初始数据*/data: {showShareSheet: false},/*** 组件的方法列表*/methods: {openShareSheet() {this.setData({showShareSheet: true})},closeShareSheet() {this.setData({showShareSheet: false});},genPlayBill() {this.triggerEvent('genPlayBill')},}
})

在点击生成海报的时候,我们向父组件发送了一个事件来调用 genPlayBill 方法,因为这个方法显然不应该在当前组件内定义,应该根据不同场景来定义我们只需要调用它就可以了。

share.wxss:

.flex-column {display: flex;flex-direction: column;align-items: center;justify-content: space-between;
}.flex-row {display: flex;flex-direction: row;align-items: center;justify-content: space-between;
}.share-sheet-mask {position: fixed;top: 0;left: 0;right: 0;bottom: 0;background: rgba(0, 0, 0, 0.60);z-index: 101;justify-content: flex-end;
}.share-sheet-mask .share-sheet {padding:0 24rpx;background: #f1f1f1;border-radius: 16rpx 16rpx 0px 0px;width: 100%;box-sizing: border-box;
}
.share-sheet-mask .share-sheet .items {padding: 48rpx 0 31rpx 0;justify-content: space-around;border-bottom: 0.5px solid rgba(39,36,71,0.20);
}
.share-sheet-mask .share-sheet .items .item{text-align: center;
}
.share-sheet-mask .share-sheet .items .item .ico {width: 80rpx;height: 80rpx;background: #ffffff;border-radius: 50%;box-shadow: 0 0 12rpx 0 rgba(204,204,204,0.60);padding: 0;margin: 0;padding: 0;
}
/*去除button的默认黑边框*/
.share-sheet-mask .share-sheet .items .item .ico::after{border: none;
}
.share-sheet-mask .share-sheet .items .item .ico .img {margin: auto;
}
.share-sheet-mask .share-sheet .items .item .ico .wx-ico {width: 52rpx;height: 40rpx;
}
.share-sheet-mask .share-sheet .items .item .desc {font-size: 24rpx;font-family: PingFangSC, PingFangSC-Regular;color: #6d6d6d;margin-top: 14rpx;
}
.share-sheet-mask .share-sheet .items .item .ico .img-ico {width: 44rpx;height: 44rpx;
}
.share-sheet-mask .share-sheet .cancel-share-sheet {margin: 31rpx auto 80rpx auto;font-size: 32rpx;font-family: PingFangSC, PingFangSC-Regular;color: #272447;text-align: center;
}

二、定义用户授权方法

刚刚我们封装了顶部的分享组件,那现在就要去定义保存图片到相册的方法了,我们写代码的时候一定要考虑清楚这段代码是否是可复用的,是否应该剥离出去。显然保存图片到相册这个方法我们应该写在 utils 目录中,因为有很多其他的场景都可以用这个方法,那我们就封装一个公用方法,参数就是图片的地址,成功的回调函数和失败的回调函数。

最复杂的就是用户授权了,我们一起看一下代码结构:

const saveImgToPhotos = (imgPath, succCallback, failedCallback) => {wx.getSetting ({ // 查询所有授权success(res) {if (res.authSetting['scope.writePhotosAlbum']) { // 用户已经授权save() // 执行保存函数}else { // 未授权wx.authorize({ scope: 'scope.writePhotosAlbum', success() {  // 用户同意授权save()  // 执行保存函数},fail(err) {  // 用户拒绝授权if (err && err.errMsg.endsWith("auth deny")) { wx.showModal({title: '授权添加到相册',content: '需要获取您的添加相册权限,请确认授权,否则分享功能无法正常使用',success: function (resolve) {  if (resolve.confirm) { // 用户同意设置授权wx.openSetting({success(res) {if (res && res.authSetting['scope.writePhotosAlbum']) {save()  // 执行保存函数}},fail(res) {   // 用户拒绝设置授权console.log(res)failedCallback('没有权限,保存失败')}})} else {  // 用户拒绝设置failedCallback('没有权限,保存失败')}}})} else {failedCallback(err && err.errMsg || '保存失败')}}})}},})}

通过 wx.authorize() 来申请权限的方式是比较繁琐的。因为它的状态比较多,大致可分为:

  1. 用户未接受或拒绝过此权限,会弹窗询问用户,用户点击同意 —— 可调用相应接口。
  2. 用户未接受或拒绝过此权限,会弹窗询问用户,用户点击拒绝 —— 打开设置页面。
  3. 如果用户已授权 —— 可调用相应接口。
  4. 用户已拒绝授权 —— 打开设置页面。

上述情况的2/4是需要小伙伴们结合 wx.openSetting() 来帮助用户进行二次授权的。

搞定了用户授权这个麻烦事后,下面就是定义我们的 save 保存函数了,这个就很简单了:

let save = function () {wx.saveImageToPhotosAlbum({filePath: imgPath,success() {succCallback()},fail(res){failedCallback(res)}})}

把这段代码添加到 saveImgToPhotos 方法中就ok了,调用 wx.saveImageToPhotosAlbum 方法,参数就是我们传进来的图片地址,成功的话就执行成功的回调,失败就执行失败的回调。

下面是官方的文档说明:

 

三、调用流程

下面我们就把组件,方法这些东西引入到我们的页面中。在页面的 json 文件中引入组件路径。

把组件引入页面wxml中:

<share-sheet id="share-sheet" catch:genPlayBill="genTimelineImage" />

这里的方法就是点击生成海报的时候调用的父组件的方法。

当点击分享的时候展示分享组件:

openShareSheet(e) {this.selectComponent("#share-sheet").openShareSheet()},

在这里通过选择器可以直接调用子组件中的方法,来控制分享组件的显示与隐藏。

genTimelineImage(e) {wx.showLoading({title: "海报生成中",icon: "loading",mask: true,})const imgSrc = `路径`wx.getImageInfo({src: imgSrc,}).then((res) => {wx.hideLoading()this.imgTempPath = res.paththis.saveTimelineImg()}).catch((err) => console.log(err))},saveTimelineImg: function () {saveImgToPhotos(this.imgTempPath, function(){this.selectComponent("#share-sheet").closeShareSheet()}.bind(this), function(errMsg) {this.selectComponent("#share-sheet").closeShareSheet()}.bind(this))},

当我们点击生成海报调用 genTimelineImage 方法的时候,通过 wx.getImageInfo 方法读取想要保存图片的临时下载路径,把他保存到外部定义的一个变量中,这样方便我们在 utils 目录中定义的 saveImgToPhotos 方法调用。这样我们整个的流程就over啦!


http://chatgpt.dhexx.cn/article/QbF1ADp8.shtml

相关文章

微信小程序 怎么插入图片?image组件的使用教程。

这期我们来学学怎么在小程序中插入图片 1.image组件的简介 是小程序中一个图片的组件 image组件有一个默认宽度和高度&#xff08;宽300px&#xff0c;高240px&#xff09; 支持 JPG、PNG、SVG、WEBP、GIF 等格式&#xff0c;2.3.0 起支持云文件ID。 我们先添加一个image组件给…

微信小程序-image(图片)

在微信小程序中&#xff0c;要显示一张图片&#xff0c;有两种图片加载方式&#xff1a; 加载本地图片加载网络图片 加载本地图片 <image class"widget__arrow" src"/image/arrowright.png" mode"aspectFill"> </image> src"/…

MTCNN人脸检测算法

人脸检测是指识别数字图像中的人脸。人脸检测可以视为目标检测的一种特殊情况。在目标检测中&#xff0c;任务是查找图像中特定类的所有对象的位置和大小。例如行人和汽车。 在人脸检测中应用较广的算法就是MTCNN&#xff08; Multi-task Cascaded Convolutional Networks的缩…

于仕琪的人脸检测算法

转自&#xff1a;https://blog.csdn.net/Jacky_Ponder/article/details/51819273 于仕琪的人脸检测算法&#xff0c;对Windows下的商业使用也免费。刚更新了一次算法&#xff1a;①正面人脸检测的角度范围从[-40, 40]度提升到[-60,60]度&#xff0c;检测角度变大但计算量不增加…

10种轻量级人脸检测算法大PK

几个月前&#xff0c;AIZOO曾经盘点过 最强六大开源轻量级人脸检测项目分析 | 附打包下载&#xff0c;nihate同学将它丰富到10种算法&#xff0c;并用Python.对他们进行了汇总整理&#xff0c;以及效果的对比。 Github链接&#xff1a;https://github.com/hpc203/10kinds-ligh…

目前最好的人脸检测算法,RetinaFace论文详解

原文链接&#xff1a;https://www.jianshu.com/p/d4534ac94a65 微信搜索&#xff1a;AI算法与图像处理&#xff0c;最新干货全都有 大家好&#xff0c;今天给大家分享一篇人脸算法领域非常知名的paper&#xff0c;RetinaFace(RetinaFace: Single-stage Dense Face Localisation…

人脸检测算法理解之mtcnn

最近在一次交流活动中&#xff0c;再次听别人讲人脸检测算法mtcnn&#xff0c;虽然以前也断断续续听过两次&#xff0c;对于一些技术细节仍不清楚&#xff0c;为了解决自己的困惑&#xff0c;笔者又重拾起这一算法&#xff0c;在认真研读论文和思考后有了新的理解&#xff0c;于…

人脸检测算法总结:PyramidBox

人脸检测算法总结&#xff1a;PyramidBox IntroductionPyramidBoxTraining PyramidBox是百度提出的人脸检测算法&#xff0c;提出后在widerface上排第一&#xff08;现在已经不是了&#xff0c;但仍居前三&#xff09;&#xff0c;PyramidBox可以看做是S3FD的升级版&#xff0c…

人脸检测算法总结:S3FD

人脸检测算法总结&#xff1a;S3FD——Single Shot Scale-invariant Face Detector IntroductionS3FDTraining结论 S3FD是中科院自动化所的一篇文章&#xff0c;当时一出现就刷新了wider face榜单&#xff0c;比上一篇提到的SSH略高一点。这个算法主要是解决小人脸的检测问题&a…

SSH人脸检测算法(SSH: Single Stage Headless Face Detector)

论文&#xff1a;《SSH: Single Stage Headless Face Detector》 链接&#xff1a;https://arxiv.org/pdf/1708.03979.pdf 代码链接&#xff1a;https://github.com/mahyarnajibi/SSH 摘要 我们介绍了单点无头&#xff08;SSH&#xff09;人脸检测器。与两阶段提议分类检测器…

人脸检测算法MTCNN

本文将对人脸检测效果不错的MTCNN算法做一个梳理。 论文地址 MTCNN主要分为三步&#xff1a; 最初先对图像进行多尺度变换&#xff0c;获取图像金字塔&#xff0c;获取图像多尺度信息。 P-net(Proposal Network)&#xff1a; 主要使用一个全卷机网络&#xff0c;获取候选框…

YbFace:完全开源的人脸检测算法

YbFase(yolo base face detector),是一个借鉴了yolov3的网络结构,在多特征尺度下预测人脸框的人脸检测算法.并结合了yolov4使用的mish激活函数.该模型大小仅为7,8M,无论模型大小,还是准确率,还是执行速率都很有竞争力. 源码地址(github)&#xff1a; face_detect 如果对你有…

适合ARM 的轻量级人脸检测算法汇总

目录 1、场景需求2、libfacedetection2.1 相关链接2.2 算法简介2.3 算法效果展示2.4 算法性能展示 3、Ultra-Light-Fast-Generic-Face-Detector-1MB3.1 相关链接3.2 算法简介3.3 算法效果展示3.4 算法性能展示 4、BlazeFace4.1 相关链接4.2 算法简介4.3 算法效果展示4.4 算法性…

opencv算法+人脸检测

文章目录 ORB算法视频读写图像人脸识别摄像头实时人脸检测 ORB算法 orb算法结合了Fast和Brief算法&#xff0c;提出了构造金字塔&#xff0c;为Fast特征点添加了方向&#xff0c;从而使得关键点具有了尺度不变性和旋转不变性。 # orb算法结合了Fast和Brief算法&#xff0c;提…

人脸检测算法对比分析

&#xfeff;&#xfeff; https://blog.csdn.net/twinkle_star1314/article/details/53318689 人脸识别包括以下5个步骤&#xff1a;人脸检测、图像预处理、特征提取、匹配、结果输出。 人脸检测是人脸识别中的第一个环节&#xff0c;是一项关键技术。人脸检测是指假设在输入…

人脸检测算法:mtcnn简介

人脸检测算法:MTCNN简介 算法流程网络介绍训练方法 MTCNN是一个针对于人脸检测的模型, 由PNet, RNet, 和ONet三个网络组成,三个网络都比较轻量, 易于训练.基于pytorch的实现可以看我这篇&#xff1a; 链接: l利用celebA数据集训练MTCNN网络. 算法流程 1. 对传入P网络的图片re…

10种轻量级人脸检测算法的比拼

关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;ComputerVisionGzq 学习群&#xff5c;扫码在主页获取加入方式 转自&#xff1a;https://blog.csdn.net/nihate/article/details/108798831 计算机视觉研究院专栏 作者&#xff1a;Edison_G 最近在微信公众号里看到…

mtcnn人脸检测算法介绍

0. 概述 MTCNN(Multi-task Cascaded Convolutional Networks&#xff0c;多任务卷积神经网络)&#xff0c;是2016年由Kaipeng Zhang、Zhanpeng Zhang等提出的一种多任务人脸检测模型&#xff0c;该模型使用3个CNN级联算法结构&#xff0c;将人脸检测和人脸特征点提取同时完成。…

Matlab人脸检测算法详解

这是一个Matlab人脸检测算法详解 前言人脸检测结果算法详解源代码解析所调用函数解析bwlabel(BW,n)regionpropsrectangle 总结 前言 目前主流的人脸检测与人脸识别算法主要基于人工神经网络进行训练与检测&#xff0c;本文基于数字图像处理解析一个非人工神经网络的有趣人脸检…

人脸检测算法落地详解

人脸检测 Face Detection 目标&#xff1a;人脸检测的目的是找出一张图片中的所有人脸的位置信息 人脸检测是人脸其他应用的基础&#xff0c;只有获取到了是否有人脸和人脸的精确的位置信息&#xff0c;其它的应用才能继续开展&#xff0c;所以说人脸检测是一个基础且重要的一…