头像生成小程序搭建(免费分享)

如下图为小程序页面的基本效果,下面将介绍该小程序的功能

页面template代码如下:

<template><view class="avatar-containner"><block v-if="!showCropper"><image class="pageback" src="../../static/images/pageback.jpg" mode="aspectFill"></image><view style="width: 100%;height: 60rpx;"></view><!-- canvas绘制区域 --><view class="canvas_wrap"><canvas canvas-id="avatarAreaRef" hidpi="false" class="canvas_box"></canvas></view><!-- 按钮交互区 --><view class="fun_box"><view @click="chooseImage" class="btn">获取头像</view><view class="btn " @click="saveToPhoto"><text>保存到相册</text></view><view class="btn sharephoto"><button class="share_btn" hover-class="none" openType="share"></button>分享给好友</view></view><!-- 头像挂件元素 --><view class="avatar_element"><view class="avatar_classify"><view class="avatar-title-box"><view class="avatar-title" @click="chooseClassify(index)" v-for="(item,index) in avatarCategoryList" :class="{'avatar-title-check':checkIndex==index}">{{item.name}}</view></view><scroll-view  lower-threshold="20" :scroll-x="true" class="scroll-view" show-scrollbar="false" ><view class="scroll-item" @click="addPendant(item)" v-for="(item,index) in pictureList"><image mode="aspectFill" style="width: 100%;height: 100%;" :src="item.pic"></image></view></scroll-view></view></view><!-- 原生模板广告 --><view class="adContainer" style="width: 100%;height: 260rpx;z-index: 10;" v-if="adverAd != null && adverAd != ''"><ad :unit-id="adverAd" ad-type="video" @load="adLoadSuccess" @error="adLoadError"></ad></view></block><cropper ref="cropper"  :class="{'croppercss':showCropper}" class="hidden" :aspectRatio="1" @complete="complete" @cancel="cancel" ></cropper></view>
</template>

1、获取头像

小程序会调用手机相册,让用户选择一张图片作为基础头像,这里调用了uni.chooseImage接口能力,并默认设置选择的图片以原图的形式展示出来,并且以500*500像素进行裁剪。

当然有伙伴会有疑惑为什么不让用户直接选择自己的微信头像,我这里的解释是目前腾讯提供给开发者的微信头像是比较模糊的(除了一些小程序还在用旧的获取用户信息接口)

代码如下:

//选择图片然后裁剪
chooseImage(){var that = this;uni.chooseImage({count: 1, //默认9sizeType: ['original'], //可以指定是原图还是压缩图,默认二者都有sourceType: ['album'], //从相册选择crop:{width:500,height:500},success: function (res) {that.showCropper = true;//拿到相册的图片,然后进入裁剪组件进行裁剪that.$refs.cropper.init(res.tempFilePaths[0]);}});//接收cropper页面传递的图片路径uni.$on('Cropper', path => {if(path){console.log("返回路径:",path)// 上传图片方法that.avatarPath = path;that.drawAvatar();}});
}

2、点击头像框素材

点击头像框时会对画布的元素进行重新绘制,先清除画布元素,然后先绘制头像,再绘制头像框,这样的顺序保证了头像框的图层在头像的上面!

代码如下:

//点击任意头像框素材事件函数
addPendant(item){this.avatarFramePath = item.pic;this.drawAvatar();
},
async drawAvatar(){uni.showLoading({title:"处理中"})if(!this.avatarPath && !this.avatarFramePath){return;}//先清除画布this.clearCanvas();//先绘制头像if(this.avatarPath){await this.drawImage(this.avatarPath);}//再绘制头像框if(this.avatarFramePath){await this.drawImage(this.avatarFramePath);}uni.hideLoading();
},
async drawImage(url){// 加载第一张图片到canvas上const imageInfo = await this.loadImage(url);this.canvasContext.drawImage(imageInfo.path, 0, 0, 350*this.powerW,  350*this.powerW );this.canvasContext.draw(true);
}

3、保存到相册

这一个步骤是最后一步,会提前检查用户有无获取头像并且选择头像框,如果没有则弹出提示;

条件通过后调用uni.canvasToTempFilePath能力对画布转换为图像,并自动保存到手机相册里面,

值得注意的是用户如果没有赋予scope.writePhotosAlbum写入相册权限,则无法进行该功能,所以在保存相册之前,程序会检查用户是否赋予了该权限,再去执行对应功能代码!

代码如下:

saveToPhoto(){if(!this.avatarPath || this.avatarPath == "" ){uni.showToast({title:"请获取头像",icon:"none",duration:1000})return;}if(!this.avatarFramePath || this.thisavatarFramePath == "" ){uni.showToast({title:"请选择头像框",icon:'none',duration:1000})return;}uni.showLoading({title:"正在保存中"})uni.canvasToTempFilePath({// res.tempFilePath临时路径canvasId: 'avatarAreaRef',success: (res) => {console.log(res, '临时路径');uni.saveImageToPhotosAlbum({ // 保存本地filePath: res.tempFilePath,success: (response) => {uni.showToast({title: '保存成功',icon: 'success'})console.log(response, 'success');},fail: (response) => {console.log(response, 'error');uni.openSetting({ //打开权限success: (response) => {if (!response.authSetting['scope.writePhotosAlbum']){uni.showToast({title: '获取权限成功, 再次点击即可保存',icon: none})} else {uni.showToast({title: '获取权限失败, 无法保存',icon: none})}}})},complete: (response)=>{uni.hideLoading();}})},fail:(err)=>{console.log("canvasToTempFilePath失败:",err)}})
}

此外,小程序里面的头像框素材图片是通过开放接口获取的,该接口需要加入到域名白名单下:https://bzadmin.ajiexcx.cn,否则真机测试没有预览到真实效果;

最后小伙伴们拿到源码后,记得去mainifest.json文件里,到微信小程序配置里面修改自己的小程序appid哦,本次小程序案例可以前往《青枫壁纸》小程序查看效果,源码获取请前往《星梦Blog》小程序中获取😘😘

如果喜欢本文章,欢迎点赞+收藏😆,如果疑惑可在评论区留言

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Confluent Cloud 的 Elasticsearch Connector 部署 Elastic Agent

作者&#xff1a;来自 Elastic Nima Rezainia Confluent Cloud 用户现在可以使用更新后的 Elasticsearch Sink Connector 与 Elastic Agent 和 Elastic Integrations 来实现完全托管且高度可扩展的数据提取架构。 Elastic 和 Confluent 是关键的技术合作伙伴&#xff0c;我们很…

Spring 定时任务:@Scheduled 注解四大参数解析

本文主要介绍了在 Spring 框架中使用Scheduled注解实现定时任务的方法&#xff0c;重点讲解了fixedRate、fixedDelay、cron和initialDelay这四个参数的用法&#xff0c;并通过实例代码进行了详细说明。 1. fixedRate 参数 参数含义 fixedRate指定任务固定时间间隔执行。如设…

刷题总结 回溯算法

为了方便复习并且在把算法忘掉的时候能尽量快速的捡起来 刷完回溯算法这里需要做个总结 回溯算法的适用范围 回溯算法是深度优先搜索&#xff08;DFS&#xff09;的一种特定应用&#xff0c;在DFS的基础上引入了约束检查和回退机制。 相比于普通的DFS&#xff0c;回溯法的优…

【MySQL】我在广州学Mysql 系列——MySQL用户管理详解

ℹ️大家好&#xff0c;我是练小杰&#xff0c;本博客是春节前最后一篇了&#xff0c;在此感谢大佬们今年的支持&#xff01;&#xff01;&#x1f64f;&#x1f64f; 接下来将学习MYSQL用户管理的相关概念以及命令~~ 回顾&#xff1a;&#x1f449;【MYSQL触发器的使用】 数据…

网络编程-网络原理HTTP1

文章目录 HTTP请求/响应的基本结构认识URLURL是什么和基本格式关于encoding机制 认识方法(method)GET方法简介GET方法的特点POST方法简介POST方法的特点GET和POST的区别(经典面试题)关于GET和POST的补充说明Restful风格 上节主要是对http协议的一些最基本的概念做出一些说明, 然…

概率密度函数(PDF)分布函数(CDF)——直方图累积直方图——直方图规定化的数学基础

对于连续型随机变量&#xff0c;分布函数&#xff08;Cumulative Distribution Function, CDF&#xff09;是概率密度函数&#xff08;Probability Density Function, PDF&#xff09;的变上限积分&#xff0c;概率密度函数是分布函数的导函数。 如果我们有一个连续型随机变量…

[Python学习日记-79] socket 开发中的粘包现象(解决模拟 SSH 远程执行命令代码中的粘包问题)

[Python学习日记-79] socket 开发中的粘包现象&#xff08;解决模拟 SSH 远程执行命令代码中的粘包问题&#xff09; 简介 粘包问题底层原理分析 粘包问题的解决 简介 在Python学习日记-78我们留下了两个问题&#xff0c;一个是服务器端 send() 中使用加号的问题&#xff0c…

【落羽的落羽 数据结构篇】算法复杂度

文章目录 一、数据结构和算法简介二、算法复杂度1. 时间复杂度2. 空间复杂度 一、数据结构和算法简介 数据结构是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有用途都有用&#xff0c;所以我们要学…

22_解析XML配置文件_List列表

解析XML文件 需要先 1.【加载XML文件】 而 【加载XML】文件有两种方式 【第一种 —— 使用Unity资源系统加载文件】 TextAsset xml Resources.Load<TextAsset>(filePath); XmlDocument doc new XmlDocument(); doc.LoadXml(xml.text); 【第二种 —— 在C#文件IO…

第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

第十五届的题目在规定时间内做出了前5道&#xff0c;还有2道找时间再磨一磨。现在把做的一些思路总结如下&#xff1a; 题1&#xff1a;握手问题 问题描述 小蓝组织了一场算法交流会议&#xff0c;总共有 50人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例…

联想电脑怎么设置u盘启动_联想电脑设置u盘启动方法(支持新旧机型)

有很多网友问联想电脑怎么设置u盘启动&#xff0c;联想电脑设置u盘启动的方法有两种&#xff0c;一是通过bios进行设置。二是通过快捷方式启动进入u盘启动。但需要注意有两种引导模式是&#xff0c;一种是uefi引导&#xff0c;一种是传统的leacy引导&#xff0c;所以需要注意制…

GitHub Actions 使用需谨慎:深度剖析其痛点与替代方案

在持续集成与持续部署&#xff08;CI/CD&#xff09;领域&#xff0c;GitHub Actions 曾是众多开发者的热门选择&#xff0c;但如今&#xff0c;其弊端逐渐显现&#xff0c;让不少人在使用前不得不深思熟虑。 团队由大约 15 名工程师组成&#xff0c;采用基于主干的开发方式&am…

Leetcode-两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

MySQL安装教程

一、下载 点开下面的链接&#xff1a;下载地址 点击Download 就可以下载对应的安装包了, 安装包如下: 二、解压 下载完成后我们得到的是一个压缩包&#xff0c;将其解压&#xff0c;我们就可以得到MySQL 8.0.34 的软件本体了(就是一个文件夹)&#xff0c;我们可以把它放在你想…

BGP分解实验·11——路由聚合与条件性通告(3)

续接上&#xff08;2&#xff09;的实验。其拓扑如下&#xff1a; 路由聚合的负向也就是拆分&#xff0c;在有双出口的情况下&#xff0c;在多出口做流量分担是优选方法之一。 BGP可以根据指定来源而聚合路由&#xff0c;在产生该聚合路由的范围内的条目注入到本地BGP表后再向…

INCOSE需求编写指南-第1部分:介绍

第1部分&#xff1a;介绍Section 1: Introduction 1.1 目的和范围 Purpose and Scope 本指南专门介绍如何在系统工程背景下以文本形式表达需求和要求陈述。其目的是将现有标准&#xff08;如 ISO/IEC/IEEE 29148&#xff09;中的建议以及作者、主要贡献者和审稿员的最佳实践结…

基于神经网络的视频编码NNVC(1):帧内预测

在H.266/VVC发布后&#xff0c;基于传统编码框架提升压缩率越来越难&#xff0c;随着深度学习的发展&#xff0c;研究人员开始尝试将神经网络引入编码器。为此&#xff0c;JVET工作组在2020年成立AHG11小组来专门进行基于神经网络的视频编码的研究。 为了方便研究&#xff0c;工…

深入探究分布式日志系统 Graylog:架构、部署与优化

文章目录 一、Graylog简介二、Graylog原理架构三、日志系统对比四、Graylog部署传统部署MongoDB部署OS或者ES部署Garylog部署容器化部署 五、配置详情六、优化网络和 REST APIMongoDB 七、升级八、监控九、常见问题及处理 一、Graylog简介 Graylog是一个简单易用、功能较全面的…

寒假1.23

题解 web&#xff1a;[极客大挑战 2019]Secret File&#xff08;文件包含漏洞&#xff09; 打开链接是一个普通的文字界面 查看一下源代码 发现一个链接&#xff0c;点进去看看 再点一次看看&#xff0c;没什么用 仔细看&#xff0c;有一个问题&#xff0c;当点击./action.ph…

ORB-SLAM2源码学习:Initializer.cc⑧: Initializer::CheckRT检验三角化结果

前言 ORB-SLAM2源码学习&#xff1a;Initializer.cc⑦: Initializer::Triangulate特征点对的三角化_cv::svd::compute-CSDN博客 经过上面的三角化我们成功得到了三维点&#xff0c;但是经过三角化成功的三维点并不一定是有效的&#xff0c;需要筛选才能作为初始化地图点。 …