「喜迎华诞」手把手教你用微信小程序给头像带上小旗帜

news/2024/5/4 6:40:48/文章来源:https://blog.csdn.net/weixin_42794881/article/details/127123508

文章目录

    • 一、文章前言
    • 二、实现原理
    • 三、开发步骤
    • 四、完整代码
    • 五、国庆临近,祝祖国永远繁荣昌盛!

一、文章前言

  2022年是新中国成立73周年,在这个举国欢庆的日子里,让我们给头像上加上小红旗,迎国庆换新颜,一起为祖国母亲庆生吧!

二、实现原理

使用canvas配合image来实现,将canvas隐藏在所展示的image图片后面,点击保存时将canvas画布上的内容进行绘制并保存图片至手机相册。

三、开发步骤

2.1、创建微信公众平台账号并安装微信Web开发者工具。
2.2、打开开发工具,新建一个项目,因为实现起来不需要服务器也不需要云函数,所以我们这里选择不使用云服务。
在这里插入图片描述
2.3、在pages文件夹下面创建一个文件夹并新建对应的page文件。
在这里插入图片描述
2.4、在wxml文件绘制两个image以及两个view标签,给两个view增加触摸或者点击事件。

 	<image class="bg" src="{{bgSrc}}" /><image class="img" src="{{imgSrc}}" /><view catchtap="choose" class="btn1">选择底片图</view><view catchtap="choose1" class="btn1">选择覆盖图</view>

2.5、在js文件中实现对应的绑定事件,将选择的图片在界面上进行展示。

    let that= this;wx.chooseImage({success: function (res) {that.bgSrc = res.tempFilePaths[0];that.setData({bgSrc: res.tempFilePaths[0]})}});

2.6、回到wxml文件中,绘制canvas标签。这里要注意的是需要将image标签置于canvas标签上面,通过css样式中的z-index和position属性值来实现,如果将canvas画布置于顶层的话,那我们就无法直观的预览上传图片之后的效果,用户也能够直接在这个画布上操作涂画,这对我们最终导出的海报图片影响是很大的。

 <canvas class="myCanvas" canvas-id="myCanvas" style="width: 375px; height: 375px;"></canvas>

2.7、在wxml文件中绘制view标签,增加触摸或点击事件,给用户提供保存海报的入口。

	<view catchtap="saveImg" class="btn2">保存海报</view>

2.8、js文件在保存海报的响应事件中,我们需要提前向用户发起请求,以此来询问用户是否同意授权小程序能否将图片保存至手机的权限,如果用户之前已经同意授权,则不会出现授权弹窗,会直接进入成功的回调。

    wx.getSetting({success(res) {if (!res.authSetting['scope.writePhotosAlbum']) {wx.authorize({scope: 'scope.writePhotosAlbum',success() {that.saveImageFunction();}});} else {that.saveImageFunction();}}});

2.9、实现saveImageFunction()函数,该函数的作用是将canvas画布上面的内容进行导出。在处理的时候可以增加一些加载中的动画,增强用户体验。

	wx.showLoading({title: '保存中...'});let that= this;const ctx = wx.createCanvasContext('myCanvas');ctx.drawImage(self.bgSrc, 0, 0, 375, 375);ctx.drawImage(self.imgSrc, 1, -20, 175, 175);ctx.draw(false, function (e) {// 保存到本地wx.canvasToTempFilePath({x: 0,y: 0,width: 375,height: 417,canvasId: 'myCanvas',success: function (res) {let pic = res.tempFilePath;wx.saveImageToPhotosAlbum({filePath: pic,success(res) {wx.hideLoading();wx.showToast({title: '保存成功',icon: 'success',duration: 2000});}, fail: function (res) {wx.hideLoading();}});},fail: function (res) {wx.hideLoading();}});});

四、完整代码

<!--index.wxml-->
<view class="content"><view class="show_block"><image class="bg" src="{{bgSrc}}" /><image class="img" src="{{imgSrc}}" /><canvas class="myCanvas" canvas-id="myCanvas" style="width: 375px; height: 375px;"></canvas></view><view style="display: flex;"><view catchtap="choose" class="btn1">选择底片图</view><view catchtap="choose1" class="btn1">选择覆盖图</view><view catchtap="save" class="btn2">保存海报</view></view>
</view>
.content .show_block {position: relative;width: 750rpx;height: 750rpx;
}.content .bg {display: block;width: 100%;height: 100%;
}.content .img {position: absolute;top: -20rpx;left: 1rpx;display: block;width: 350rpx;height: 350rpx;
}.content .myCanvas {z-index: -1;position: absolute;top: 0;left: 0;
}.btn1 {margin-top: 24rpx;margin-left: 50rpx;text-align: center;line-height: 62rpx;font-size: 28rpx;width: 181rpx;height: 62rpx;background: #4FAFF2;border-radius: 10rpx;color: white;
}
.btn2 {margin-top: 24rpx;margin-left: 50rpx;text-align: center;line-height: 62rpx;font-size: 28rpx;width: 181rpx;height: 62rpx;background: #AD302C;border-radius: 10rpx;color: white;
}
choose: function () {let self = this;wx.chooseImage({success: function (res) {self.bgSrc = res.tempFilePaths[0];self.setData({bgSrc: res.tempFilePaths[0]})}});},save: function () {let self = this;if (!this.imgSrc) {wx.showToast({title: '请先选择图片',icon: 'none',duration: 2000});return false;}wx.getSetting({success(res) {if (!res.authSetting['scope.writePhotosAlbum']) {wx.authorize({scope: 'scope.writePhotosAlbum',success() {self.saveImage();}});} else {self.saveImage();}}});},saveImage() {wx.showLoading({title: '保存中...'});let self = this;const ctx = wx.createCanvasContext('myCanvas');ctx.drawImage(self.bgSrc, 0, 0, 375, 375);ctx.drawImage(self.imgSrc, 1, -20, 175, 175);ctx.draw(false, function (e) {// 保存到本地wx.canvasToTempFilePath({x: 0,y: 0,width: 375,height: 417,canvasId: 'myCanvas',success: function (res) {let pic = res.tempFilePath;wx.saveImageToPhotosAlbum({filePath: pic,success(res) {wx.hideLoading();wx.showToast({title: '保存成功',icon: 'success',duration: 2000});}, fail: function (res) {wx.hideLoading();}});},fail: function (res) {wx.hideLoading();}});});}

五、国庆临近,祝祖国永远繁荣昌盛!

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

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

相关文章

视频倒放怎么制作?快来学会这几个简单的方法

众所周知&#xff0c;如果我们想要让视频更具有观赏性的话&#xff0c;少不了用视频倒放功能来制作视频。不过还是有很多小伙伴不知道视频倒放怎么制作&#xff1f; 下面我就来手把手教你们视频倒放的制作方法&#xff0c;你们快来看看吧&#xff01; 方法一&#xff1a;提词全…

Monaco Editor教程(五): 实现同时多文件编辑,tab切换

背景 上一篇我们讲解了如何设置编辑器的值&#xff0c;获取编辑器的值&#xff0c;以及监听编辑器的内容修改。这些功能对于基础的单文件修改&#xff0c;一次只修改一个文件的业务场景比较友好。但如果是复杂的场景&#xff0c;比如WEB IDE&#xff0c;同时打开一个项目的多个…

聊聊SQL注入

明天是国庆1001,祝大家国庆节快乐!!!这个月还有属于程序员的节日:1024SQL注入问题概述:首先SQL注入是一个非常危险的操作,很可能被一些不怀好意的人钻空导致我们系统出现异常等状况,比如数据库遭到破坏或被入侵。原因:使用JDBC的Statement语句添加SQL语句由于我们的JD…

直播电商开发,源码无加密

随着直播电商的流行&#xff0c;很多企业开始使用商场电商直播系统&#xff0c;该企业使用电商直播系统的优势具体体现在哪里&#xff1f;下面由零七科技小编为您总结企业电商直播系统的优点。 使用电商直播系统的优点&#xff1a; 1、全面展示商品风格和效果。 与在线平台的…

【Django-rest-framework框架】第04回 视图集

目录1. 两个视图基类1.1 GenericAPIview属性和方法1.2 基于APIView写5个接口1.3 基于GenericAPIview写5个接口2. 5个视图扩展类3. 9个视图子类4. 视图集5. 源码分析ViewSetMixin6. 总结7 继承关系画出来,有哪些常用属性或方法写出来 1. 两个视图基类 1.1 GenericAPIview属性和…

【redis】7.1 分布式架构概述(章节介绍)

分布式架构概述 请求业务比较长&#xff08;耗时业务&#xff09;&#xff0c;需要分布式系统。 1. 本章节内容 分布式缓存中间件Redis分布式会话与单点登录分布式搜索引擎Elasticsearch分布式文件系统分布式消息队列分布式锁数据库读写分离与分库分表数据库表全局唯一主键i…

迭代器并不全是指针,list的迭代器与vector和string的有什么不一样,让博主告诉你其底层原理!

链表的模拟实现 文章目录链表的模拟实现一、list的基本架构&#x1f916;_list_node基本构架--双向带头循环链表二、list的迭代器--重点&#x1f431;‍&#x1f464;list迭代器的基本架构构造函数--node*封装operator*()--得到值operator!()--跟另一个迭代器进行比较operator(…

xLua热更新(一)xLua基本使用

一、什么是xLua xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力&#xff0c;借助xLua&#xff0c;这些Lua代码可以方便的和C#相互调用。 xLua是用来实现Lua代码与C#代码相互调用的插件。我们可以借助这个插件来实现热更新方案。 那么为什么要选择Lua实现热更新呢&am…

报告分享|数字化转型,从战略到执行报告

报告链接:http://tecdat.cn/?p=28672 如何加速国家、城市、行业、企业数字化进程,激发数字经济新动能。这份报告通过洞察数字化的6大改变、4大载体、4个阶段、20+场景、100+国家/项目案例/数据,全面系统性地阐述了多层次多场景数字化如何落地实施,最终带来经济、社会价值的…

报告分享|2022年企业数字化人才发展白皮书

报告链接:http://tecdat.cn/?p=28670 数字经济时代,企业对数字化人才的需求急剧增长。此报告对数字化人才培养和企业数字化人才发展现状进行梳理和研究,聚焦于金融、零售、能源和制造四个行业,采用定量与定性相结合的研究方法,对数字化人才的发展态势、岗位能力需求、培养…

第八章 常用用类

文章目录8.4 StringBuffer类8.4.1 StringBuffer对象8.4.2 StringBuffer类的常用方法1.append方法2.charAt(int n)和setCharAt(int n, char ch)8.5 Date类与Calendar类8.5.1 Date类8.5.2 Calendar类8.6 日期的格式变化8.6.1 format方法8.6.2 不同区域的星期格式8.7 Math类、BigI…

【算法】【二叉树模块】求一个二叉树“子树“是否包含另一个二叉树的全部拓扑结构

目录前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本思考感悟写在最后前言 当前所有算法都使用测试用例运行过&#xff0c;但是不保证100%的测试用例&#xff0c;如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识&#xff01; 问题介绍 …

三个线程顺序打印ABC?我有十二种做法,彻底掌握多线程同步通信机制

大家好&#xff0c;我是老三&#xff0c;这篇文章分享一道非常不错的题目&#xff1a;三个线程按序打印ABC。 很多读者朋友应该都觉得这道题目不难&#xff0c;这次给大家带来十二种做法&#xff0c;一定有你没有见过的新姿势。 1. synchronizedwaitnotify 说到同步&#xf…

Swift中的内存访问冲突、指针、局部作用域

内存访问冲突&#xff08;Conflicting Access to Memory&#xff09; 1、内存访问冲突会在两个访问满足以下条件时发生&#xff1a; 至少一个是写入操作它们访问的是同一块内存它们的访问时间重叠&#xff08;比如在同一个函数内&#xff09; //无内存访问冲突 func plus(_ n…

PIE-engine 教程 ——利用NDWI加载青海湖三年水域影像和面积计算

这里我们首先画一个自己选择的研究区&#xff0c;用于方便计算NDWI&#xff0c;这里我们将青海湖区域作为我们的研究区&#xff0c;第二步我们就是要设定一个函数&#xff0c;用于在函数中执行循环遍历&#xff0c;这里包括去云和影像筛选过程&#xff0c;最后按照最大值合成&a…

Windows 10 docker 容器添加新端口映射的方法与步骤

在Docker容器已经创建后&#xff0c;需要添加新的端口映射&#xff0c;即对已经存在的Docker容器添加新的端口映射&#xff0c;可以通过以下步骤来添加&#xff0c;即通过修改配置文件的方法。 1、Windows 10 下 Dockers容器的配置文件存在的路径为&#xff1a; 笔者本文是20…

CLIP扩展

Audio CLIP:Extend CLIP to Image,Text and Audio&#xff08;语音&#xff09; 在已有的image、text 的基础上又加上了audio语音模态。 找了一些视频&#xff0c;有视频帧&#xff08;图像&#xff09;、文本、语音三种模态的信息&#xff0c;仿照CLIP的模型结构。三种模态两…

SpringSecurity + JWT(前后端分离)

文章目录一、先来聊聊 SpringSecurity JWT二、简单聊聊SpringSecurity 完整流程1、认证2、授权三、撸代码1、入门案例2、认证-前端端分离 Demo2.1 环境准备2.2 密码加密存储2.3 数据库校验存储2.4 编写自定义登陆接口2.5 JWT 认证过滤器2.6 退出登陆3、授权-前后端分离 Demo3.…

Spring In Action 5 学习笔记 chapter8 RabbitMQ(AMQP)要点

本文记录Sping In Action5 第8章 发送异步消息 RabbitMQ(AMQP)中的踩坑情况。 网搜的Spring In Action5的书籍在线翻译 https://potoyang.gitbook.io/spring-in-action-v5/ 第8章的源码请自行github或gitee搜索&#xff0c;或参考一下。 GitHub - habuma/spring-in-action-5…

web学生网页设计作业源码 HTML+CSS+JS 网上鲜花商城购物网站

&#x1f329;️ 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f482; 作者主页: 【进入主页—&#x1f680;获取更多源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;HTML5网页期末作业 (1000套…