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

news2025/1/24 20:56:31

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

页面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, //默认9
		sizeType: ['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.coloradmin.cn/o/2281622.html

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

相关文章

Unity自学之旅05

Unity自学之旅05 Unity学习之旅⑤&#x1f4dd; AI基础与敌人行为&#x1f94a; AI导航理论知识&#xff08;基础&#xff09;开始实践 &#x1f383; 敌人游戏机制追踪玩家攻击玩家子弹碰撞完善游戏失败条件 &#x1f917; 总结归纳 Unity学习之旅⑤ &#x1f4dd; AI基础与敌…

【分布式日志篇】从工具选型到实战部署:全面解析日志采集与管理路径

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

电子应用设计方案102:智能家庭AI鱼缸系统设计

智能家庭 AI 鱼缸系统设计 一、引言 智能家庭 AI 鱼缸系统旨在为鱼类提供一个健康、舒适的生活环境&#xff0c;同时为用户提供便捷的管理和观赏体验。 二、系统概述 1. 系统目标 - 自动维持水质稳定&#xff0c;包括水温、酸碱度、硬度和溶氧量等关键指标。 - 智能投食&…

【安当产品应用案例100集】034-安当KSP支持密评中存储数据的机密性和完整性

安当KSP是一套获得国密证书的专业的密钥管理系统。KSP的系统功能扩展图示如下&#xff1a; 我们知道商用密码应用安全性评估中&#xff0c;需要确保存储的数据不被篡改、删除或者破坏&#xff0c;必须采用合适的安全方案来确保存储数据的机密性和完整性。KSP能否满足这个需求呢…

linux系统下的磁盘扩容

背景&#xff1a;之前通过虚拟机装linux时硬盘空间设置的不够用&#xff0c;所以需要再加点容量。 1、首先通过虚拟机来扩展硬盘 注意&#xff1a;需要关闭linux系统&#xff1b;需要删除之前的快照&#xff1b; 我原来为27G&#xff0c;现在增加到了40G&#xff0c;如下图: …

【MySQL】 库的操作

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;【MySQL】 库的操作 发布时间&#xff1a;2025.1.23 隶属专栏&#xff1a;MySQL 目录 库的创建语法使用 编码规则认识编码集查看数据库默认的编码集和校验集查看数据库支持的编码集和校验集指定编码创建数据库验证不…

fpga学习入门 串口rs232回环

奇偶检验位这里是省略了 做好回环后可以使用上位机做回环测试&#xff0c;top文件写的方式就是将rx&#xff08;fpga端&#xff09;接受到的模块&#xff08;pc端&#xff09;tx发送出去&#xff0c;这两个端口用杜邦线连接&#xff0c;同理模块的rx连接fpga的tx&#xff0c;…

认识Django项目模版文件——Django学习日志(二)

1.默认文件介绍 └── djangoproject1/├── djangoproject1/│ ├── urls.py [URL和函数的对应关系]【常用文件】│ ├── settings.py [项目配置文件]【常用文件】│ ├── _init_.py│ ├── wsgi.py [接受网络请求] 【不要动】│ └──…

微信小程序中常见的 跳转方式 及其特点的表格总结(wx.navigateTo 适合需要返回上一页的场景)

文章目录 详细说明总结wx.navigateTo 的特点为什么 wx.navigateTo 最常用&#xff1f;其他跳转方式的使用频率总结 以下是微信小程序中常见的跳转方式及其特点的表格总结&#xff1a; 跳转方式API 方法特点适用场景wx.navigateTowx.navigateTo({ url: 路径 })保留当前页面&…

postgresql15的启动

PostgreSQL是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统&#xff0c;且因为许可证的灵活&#xff0c;任何人都可以以任何目的免费使用、修改和分发PostgreSQL。现在国产数据库大力发展阶段&#xff0c;学习和熟悉postgresql的功能是非常有必要的&#x…

ChatGPT结合Excel辅助学术数据分析详细步骤分享!

目录 一.Excel在学术论文中的作用✔ 二.Excel的提示词✔ 三. 编写 Excel 命令 四. 编写宏 五. 执行复杂的任务 六. 将 ChatGPT 变成有用的 Excel 助手 一.Excel在学术论文中的作用✔ Excel作为一种广泛使用的电子表格软件&#xff0c;在学术论文中可以发挥多种重要作用&a…

大模型 / 智能体在智能运维领域的应用总结与发展趋势概述

智能体 智能运维 &#xff1f; 回顾大模型的发展 大模型的发展在过去两年间呈现出爆炸式的增长&#xff0c;成为推动人工智能领域快速进步的关键力量。 2023年3月&#xff1a;百度发布了其知识增强的大语言模型产品“文心一言”&#xff0c;这标志着国内AI大模型产业竞争的…

戴尔电脑设置u盘启动_戴尔电脑设置u盘启动多种方法

最近有很多网友问&#xff0c;戴尔台式机怎么设置u盘启动&#xff0c;特别是近两年的戴尔台式机比较复杂&#xff0c;有些网友不知道怎么设置&#xff0c;其实设置u盘启动有两种方法&#xff0c;下面小编教大家戴尔电脑设置u盘启动方法。 戴尔电脑设置u盘启动方法一、戴尔进入b…

【博客之星】年度总结:在云影与墨香中探寻成长的足迹

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、年度回顾 1、创作历程 2、个人成长 3、个人生活与博客事业 二、技术总结 1、赛道选择 2、技术工具 3、实战项目 三、前景与展望 1、云原生未来…

《安富莱嵌入式周报》第349期:VSCode正式支持Matlab调试,DIY录音室级麦克风,开源流体吊坠,物联网在军工领域的应用,Unicode字符压缩解压

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版&#xff1a; 《安富莱嵌入式周报》第349期&#xff1a;VSCode正式支持Matlab调试&#xff0c;DIY录音室级麦克风…

cursor ide配置远程ssh qt c++开发环境过程记录

cursor是啥就不介绍了&#xff0c;好像是目前最好用的ai ide&#xff0c;下面主要是配置远程ssh连接linux机器进行qt5 c程序运行的配置过程记录。 一、c_cpp_properties.json 在项目根目录的.vscode目录里面新建c_cpp_properties.json文件&#xff0c;根据你的实际情况配置该文…

Langchain+文心一言调用

import osfrom langchain_community.llms import QianfanLLMEndpointos.environ["QIANFAN_AK"] "" os.environ["QIANFAN_SK"] ""llm_wenxin QianfanLLMEndpoint()res llm_wenxin.invoke("中国国庆日是哪一天?") print(…

lwIP——3 内存管理

目录 1.什么是内存管理 2.lwIP内存堆 3.lwIP内存堆程序代码解析 3.1 mem_init程序解析 3.2 mem_malloc程序解析 3.3 mem_free程序解析 4.lwIP内存池 5.lwIP内存池程序代码解析 5.1 实现lwIP内存池的文件 5.1.1 memp_priv.h 5.1.2 memp_std.h 5.1.3 memp.h memp_t 枚…

使用 Serilog 在 .NET Core 6.0 中日志记录

在本文中&#xff0c;我们将讨论日志记录的基础知识以及在 .NET Core 6 中使用 Serilog 的逐步实现。 先决条件 1、Visual Studio 2022。 2、C# 和 .NET Core 的基础知识。 3、.NET Core 6 SDK。 日志记录基础知识 从技术角度来说&#xff0c;日志记录是记录事件并捕获应用程…

当 Facebook 窥探隐私:用户的数字权利如何捍卫?

随着社交平台的普及&#xff0c;Facebook 已经成为全球用户日常生活的一部分。然而&#xff0c;伴随而来的隐私问题也愈发严峻。近年来&#xff0c;Facebook 频频被曝出泄露用户数据、滥用个人信息等事件&#xff0c;令公众对其隐私保护措施产生质疑。在这个信息化时代&#xf…