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

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

页面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》小程序中获取😘😘

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java面试题2025-设计模式

1.说一下开发中需要遵守的设计原则&#xff1f; 设计模式中主要有六大设计原则&#xff0c;简称为SOLID &#xff0c;是由于各个原则的首字母简称合并的来(两个L算一个,solid 稳定的)&#xff0c;六大设计原则分别如下&#xff1a; 1、单一职责原则 单一职责原则的定义描述非…

Windows Docker Desktop安装及使用 Docker 运行 MySQL

Docker Desktop是Docker的官方桌面版&#xff0c;专为Mac和Windows用户设计&#xff0c;提供了一个简单易用的界面来管理和运行Docker容器。它集成了Docker引擎&#xff0c;为开发人员提供了一个快速、可靠、可扩展的方式来构建、运行和管理应用。DockerDesktop的优势在于&…

python基础语法(4) ----- 学习笔记分享

目录 Python 使用库 以及 实战的一些案例 1. 标准库 1.1 认识标准库 1.2 使用import导入模块 1.3 代码示例:日期及结算 1.4 代码示例:字符串操作 1.5 代码示例 : 文件查找工具 2. 第三方库 2.1 认识第三方库 2.2 使用pip 2.3 代码示例:生成二维码 (1) 使用搜索引擎,…

Python-基础环境(01) 虚拟环境,Python 基础环境之虚拟环境,一篇文章助你完全搞懂!

Python的虚拟环境是一种工具&#xff0c;它能够创建一个隔离的独立Python环境。每个虚拟环境都有自己独立的Python解释器和安装的包&#xff0c;不会与其他虚拟环境或系统的全局Python环境发生冲突。虚拟环境特别适用于以下情况&#xff1a; 项目隔离&#xff1a;不同的项目可…

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(九)(完结篇)

文章目录 一、成绩查询模块实现1、学生成绩查询功能实现1.1 页面设计1.2 前端页面实现1.3 后端功能实现2、成绩分段查询功能实现2.1 页面设计2.2 前端页面实现2.3 后端功能实现二、试卷练习模块实现三、我的分数模块实现1、 页面设计2、 前端页面实现3、 后端功能实现四、交流区…

Redis --- 分布式锁的使用

我们在上篇博客高并发处理 --- 超卖问题一人一单解决方案讲述了两种锁解决业务的使用方法&#xff0c;但是这样不能让锁跨JVM也就是跨进程去使用&#xff0c;只能适用在单体项目中如下图&#xff1a; 为了解决这种场景&#xff0c;我们就需要用一个锁监视器对全部集群进行监视…

ML基础——分类模型的评估指标

以鸢尾花的分类分析为例&#xff1a; 首先我们对于3类分类做了个数字编码&#xff0c;012对应3个分类&#xff0c; 所以这就是3个分类下的预测结果指标&#xff1a; 分类为0的准确率、召回率、F1-score&#xff0c;以及support 因为前面我们数据集划分为了105 train&#xff…

安装Office自定义项,安装期间出错

个人博客地址&#xff1a;安装Office自定义项&#xff0c;安装期间出错 | 一张假钞的真实世界 卸载PowerDesigner后&#xff0c;打开“WPS文字”时出现下图错误&#xff1a; 解决方法&#xff1a; 按“WinR”快捷键&#xff0c;打开【运行】框&#xff0c;在对话框中输入“re…

Arouter详解・常见面试题

前言&#xff1a;ARouter是一个用于 Android App 进行组件化改造的路由框架 —— 支持模块间的路由、通信、解耦。 一、路由简介&#xff1a; 路由&#xff1a;就是通过互联的网络把信息从源地址传输到目的地址的活动。完成路由这个操作的实体设备就是 路由器&#xff08;Rout…

能量提升法三:赞美

前情回顾&#xff1a; 《能量提升法二&#xff1a;感恩》 片段&#xff1a;“感恩&#xff0c;就像是在跟世界说&#xff1a;谢谢你&#xff0c;我收到了&#xff0c;我很喜欢&#xff0c;请多来点” 把它归还人海&#xff0c;就当作每一个人&#xff0c;都有可能是曾经帮助…

翼星求生服务器搭建【Icarus Dedicated Server For Linux】

一、前言 本次搭建的服务器为Steam平台一款名为Icarus的沙盒、生存、建造游戏,由于官方只提供了Windows版本服务器导致很多热爱Linux的小伙伴无法释怀,众所周知Linux才是专业服务器的唯一准则。虽然Github上已经有大佬制作了容器版本但是容终究不够完美,毕竟容器无法与原生L…

Java编程语言:辉煌的历史与未来前景

如果将软件开发世界比喻成一个宇宙&#xff0c;Java 无疑是其中最亮的星星之一。它从诞生起就改变了软件开发世界的格局。发展到今天&#xff0c;Java仍然是这个世界上最重要的编程语言之一。当然&#xff0c;它也面临着新的挑战。 Java的诞生 回溯到 1991 年&#xff0c;在 …

为什么噪声不是过拟合的原因?

直观解释&#xff1a;为什么噪声不是过拟合的原因?又什么只要没有过拟合就一定有噪声?_哔哩哔哩_bilibili

【JavaWeb06】Tomcat基础入门:架构理解与基本配置指南

文章目录 &#x1f30d;一. WEB 开发❄️1. 介绍 ❄️2. BS 与 CS 开发介绍 ❄️3. JavaWeb 服务软件 &#x1f30d;二. Tomcat❄️1. Tomcat 下载和安装 ❄️2. Tomcat 启动 ❄️3. Tomcat 启动故障排除 ❄️4. Tomcat 服务中部署 WEB 应用 ❄️5. 浏览器访问 Web 服务过程详…

C语言【基础篇】之流程控制——掌握三大结构的奥秘

流程控制 &#x1f680;前言&#x1f99c;顺序结构&#x1f4af; 定义&#x1f4af;执行规则 &#x1f31f;选择结构&#x1f4af;if语句&#x1f4af;switch语句&#x1f4af;case穿透规则 &#x1f914;循环结构&#x1f4af;for循环&#x1f4af;while循环&#x1f4af;do -…

sunrays-framework配置重构

文章目录 1.common-log4j2-starter1.目录结构2.Log4j2Properties.java 新增两个属性3.Log4j2AutoConfiguration.java 条件注入LogAspect4.ApplicationEnvironmentPreparedListener.java 从Log4j2Properties.java中定义的配置读取信息 2.common-minio-starter1.MinioProperties.…

【Elasticsearch】内置分词器和IK分词器

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

简易版RAG实现

之前玩过一次RAG&#xff08;检索增强生成&#xff09;&#xff0c;链接&#xff0c;十分简陋&#xff0c;现在已经无用了&#xff0c;时隔1年半以后又再需要实现一次。其实现在做RAG已经算相对成熟了&#xff0c;要求不高的话甚至可以直接跑langchain-chatchat这类现成的。因为…

指针的介绍2后

1.二级指针 1.1二级指针的介绍 二级指针是指向指针的指针 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>int main() {int a 100;int* pa &a;int** ppa &pa;printf("a %d\n", a);printf("&a(pa) %p\n", pa);prin…

Android开发基础知识

1 什么是Android&#xff1f; Android&#xff08;读音&#xff1a;英&#xff1a;[ndrɔɪd]&#xff0c;美&#xff1a;[ˈnˌdrɔɪd]&#xff09;&#xff0c;常见的非官方中文名称为安卓&#xff0c;是一个基于Linux内核的开放源代码移动操作系统&#xff0c;由Google成立…