小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像)

小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像)

微信小程序生成特色头像,海报等是比较常见的。下面我来介绍下实现该类小程序的过程。

  1. 首先选择前端来通过 canvas 绘制。这样比较节省成本,效率也高。
  2. 小程序使用uniapp 来进行开发,方便后期打包为微信,百度等小程序。
  3. 可以扫码体验下 我的小程序 制作个性化的头像,
    制作头像小程序
  4. 下面介绍使用 wxml2canvas 生成头像的小程序的制作过程

创建项目

  1. 使用HBuilderX 创建一个 uni-app 的项目,可以参照uniapp 官网。
  2. 下载项目使用的依赖 npm init 创建package.json
  3. yarn add less wxml2canvas

生成头像的重要步骤

  1. 首先思路是上传一张自己想做为头像的图片
  2. 然后选择自己想给该图片添加的元素,利用css 定位,使图片位置重叠,产生新的效果
  3. 讲最新的效果生成图片,并下载。

上传图片

上传图片可以提供两种思路,一种是直接使用微信头像。一种是用户自己上传图片

  1. 使用微信头像的方案
wxLogin() {let _this  = this;wx.getUserProfile({desc: '获取你的头像',success: res => {console.log(res)_this.headUrl = res.userInfo.avatarUrl},fail: () => {//拒绝授权wx.showToast({title: '您拒绝了请求,不能获取你的头像',icon: 'error',duration: 2000});return;}});
},
  1. 用户自己上传图片,可以直接从相册中选择,也可以使用相机。
pictureClick (selectid) {const _this = this;let typelist = selectid === 1 ? ['camera'] : ['album']uni.chooseImage({count: 1,sourceType: typelist, //这要注意,camera掉拍照,album是打开手机相册crop: {width: 320,height: 320},success: (res)=> {_this.$refs.gmyImgCropper.chooseImage(res)}});
},
  1. 自己上传的图片,需要使用canvas 来进行裁剪为头像比列相同的图片
<imgCropper ref="gmyImgCropper" :quality="1" cropperType="fixed" :imgSrc="headUrl" @getImg="getImg"></imgCropper>
// 上面 是裁剪图片的组件, 篇幅较大,可以参考项目源码

利用css 定位生成效果图

<view class="head-box" :style="{marginTop: headboxStyle, height: showImgW}"><canvas canvas-id="myCanvas" class="myCanvas" :style="{width: showImgW, height: showImgW}"></canvas><view  class="showimg showimg-box head-img-border" :style="{width: showImgW, height: showImgW}"><pickerselect  @modelselect="modelselect"><view class="showimg normalimgbox" :style="{width: showImgW, height: showImgW, background: currentInfo.iconColor}"><image class="headimg normalimg"  src="https://bj.bcebos.com/txy-dev/txy/main/normal.png"/></view><view id="my-canvas" class="my_canvas"><view class="showimg" :style="{width: showImgW, height: showImgW}"><image mode="aspectFill " data-type="image" :data-url="headUrl"  class="headimg my_draw_canvas" :src="headUrl"/></view><view class="showimg" :style="{width: showImgW, height: showImgW}"><image mode="heightFix" data-type="image" :data-url="selectimg" class="headimg my_draw_canvas" :src="selectimg"/></view></view></pickerselect></view>
</view>

利用wxml2canvas 生成最终的头像图片

import Wxml2Canvas from 'wxml2canvas'
export const startDraw = ()=> {let that = this// 创建wxml2canvas对象let drawMyImage = new Wxml2Canvas({element: 'myCanvas', // canvas的id,obj: that, // 传入当前组件的thiswidth: 200* 2,height: 200 * 2,background: '#141415', // 生成图片的背景色progress(percent) { // 进度console.log(percent);},finish(url) { // 生成的图片wx.hideLoading()savePoster(url)},error(res) { // 失败原因console.log(res);wx.hideLoading()}}, this);let data = {// 获取wxml数据list: [{type: 'wxml',class: '.my_canvas .my_draw_canvas',  // my_canvas要绘制的wxml元素根类名, my_draw_canvas单个元素的类名(所有要绘制的单个元素都要添加该类名)limit: '.my_canvas', // 要绘制的wxml元素根类名x: 0,y: 0}]}// 绘制canvasdrawMyImage.draw(data, this);
}
export const drawMyCanvas = () => {wx.showLoading()const that = thiswx.createSelectorQuery().select('#my-canvas') // 在 WXML 中填入的 id.fields({ scrollOffset: true, size: true }, () => {startDraw()}).exec(() => {console.log(888)})
} 

将生成的图片下载到本地

export const savePoster = (url) => {const that = thiswx.saveImageToPhotosAlbum({filePath: url,success: function() {wx.showToast({title: '保存成功',icon: 'none',duration: 1500});},fail(err) {if (err.errMsg === "saveImageToPhotosAlbum:fail:auth denied" || err.errMsg === "saveImageToPhotosAlbum:fail auth deny" || err.errMsg === "saveImageToPhotosAlbum:fail authorize no response") {wx.showModal({title: '提示',content: '需要您授权保存相册',showCancel: false,success: modalSuccess => {wx.openSetting({success(settingdata) {if (settingdata.authSetting['scope.writePhotosAlbum']) {wx.saveImageToPhotosAlbum({filePath: url,success: function () {wx.showToast({title: '保存成功',icon: 'success',duration: 2000})},})} else {wx.showToast({title: '授权失败,请稍后重新获取',icon: 'none',duration: 1500});}}})}})}}})
}

下面是我的小程序体验码,项目代码。希望能和大家共同学习进步

制作头像小程序
[项目代码] https://gitee.com/eyes-star/txy-mp.git

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

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

相关文章

LLM-2020:GPT-3【参数量:1750亿(175B)】【用于训练的token数量:500B】【OpenAI】

GPT1:Imporoving Language Understanding By Generative Pre-training GPT2:Lanuage Models Are Unsupervised Multitask Learners GPT3:Language Models Are Few-shot Learners GitHub:https://github.com/openai/gpt-3 从GPT三个版本的论文名也能看出各版本模型的重点…

个人使用ChatGLM-6B遇到的部分问题汇总

本文目录 写在最前个人windows电脑部署时遇到KeyError: chatglm问题原因&#xff1a;transformers版本有问题解决方法 OSError/AssertionError/Failed to load cpm_kernels问题原因&#xff1a;配置内容没有修改、依赖包不完整解决方法 想要运行web_demo2.py时遇到No matching …

大佬联合署名!反对 ACL 设置匿名期!

夕小瑶科技说 原创 作者 | 智商掉了一地、Python 近日&#xff0c;自然语言处理领域的多位知名学者联合发起了一项反对 ACL 设置匿名期的联合署名行动&#xff0c;包括著名学者 William Wang 和 Yoav Goldberg 在内&#xff0c;还有Christopher Potts、Hal Daume、Luke Zettl…

人工智能轨道交通行业周刊-第46期(2023.5.22-5.28)

本期关键词&#xff1a;数字孪生、AI铁路人、道岔、施封锁、图像质量评价、大模型小型化 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道…

ChatGPT背后的大模型如何做推理?港中大(深圳)等最新《自然语言推理》综述详述预训练语言模型推理方法...

点击上方“AI遇见机器学习”&#xff0c;选择“星标”公众号 重磅干货&#xff0c;第一时间送 专知 自然语言推理怎么做的&#xff1f; 网站链接&#xff1a;https://arxiv.org/abs/2303.14725 本文从概念上和实践上对自然语言处理(NLP)领域的自然语言推理进行了更清晰的认识。…

ChatGPT和GPT-4的逻辑推理如何?浙大等最新《ChatGPT和GPT-4逻辑推理能力全面评测》论文解答,常规优异新数据差...

来源&#xff1a;专知 运用逻辑推理能力进行全面的自然语言理解尝试。随着生成预训练Transformer 4&#xff08;GPT-4&#xff09;的发布&#xff0c;它在推理任务上被称为“先进”的&#xff0c;我们渴望了解GPT-4在各种逻辑推理任务上的表现。本报告分析了多个逻辑推理数据集…

机器学习0 — 总体架构,ChatGPT时代必须掌握的

1 从ChatGPT看目前AI重要性 随着ChatGPT的一声巨响&#xff0c;拉响了强人工智能的序幕。ChatGPT相对于目前的各种机器人&#xff0c;简直就是弓箭和导弹的区别。沉寂了两三年后&#xff0c;AI如今又一次站在了人类工业的最高舞台。个人认为AI已经成为所有人&#xff0c;特别是…

侯世达《大西洋月刊》撰文:GPT-4写了篇《我为什么要写GEB?》,为何老夫毛了?...

来源&#xff1a;科技世代千高原 作者&#xff1a;侯世达&#xff08;道格拉斯霍夫施塔特&#xff09;2023 年 7 月 8 日 一个快得令人眼花缭乱的聊天机器人无法取代一个有思想、活生生的人类真实而反思的声音。 到目前为止&#xff0c;您很可能已经高度意识到人工智能最近由于…

产线环境故障排查常用套路

更多内容关注微信公众号&#xff1a;fullstack888 线上故障主要会包括cpu、磁盘、内存以及网络问题&#xff0c;而大多数故障可能会包含不止一个层面的问题&#xff0c;所以进行排查时候尽量四个方面依次排查一遍。 同时例如jstack、jmap等工具也是不囿于一个方面的问题的&…

vue使用websocket 导致server崩溃的问题

现象&#xff1a;项目中使用了websocket&#xff08;不管何种websocket库&#xff0c;原生websocket、io.socket&#xff09;,只要websocket服务停止&#xff0c;npm run serve 就崩溃&#xff0c;如果一致调试前后端程序的话&#xff0c;崩溃了得重启&#xff0c;此问题一致困…

QT-多线程与界面之间交互总结

1. 线程与界面组件需要注意的地方 在QThread线程中不能直接创建QWidget之类的界面组件. 因为在QT中,所有界面组件相关的操作都必须在主线程中(也就是GUI thread) 所以, QThread线程不能直接操作界面组件. 2.QThread线程如何操作界面组件-方法1 将多线程类对象封装为GUI界面…

Qt常用对话框设计

一、概述 Qt提供了多种自带的标准对话框&#xff0c;常见的对话框包括文件对话框、颜色对话框、字体对话框、输入对话框、消息对话框。 二、文件对话框 文件对话框通过QFileDialog类实现&#xff0c;通过文件对话框可以打开一个文件浏览对话框&#xff0c;可以实现打开文件、…

GUI编程--PyQt5--QWidget3 控件的交互

文章目录 控件是否可用控件是否可见编辑状态窗口的激活窗口关闭案例提示信息焦点操作 控件是否可用 obj.setEnabled(True) obj.isEnabled() 控件是否可见 显示与隐藏 本质是重新绘制所有的控件&#xff0c;从父控件依次到子控件。 obj.setVisible(True) 绘制图形 触发了pain…

Fdog系列(四):使用Qt框架模仿QQ实现登录界面,界面篇。

文章目录 一. 前言二. 正文1. 创建窗口&#xff0c;添加基本组件2. 自定义标题&#xff0c;隐藏任务栏标题&#xff0c;实现系统托盘显示3. 美化主界面&#xff0c;文本框的奇思妙想4. 实现背景阴影 一. 前言 Fdog系列已写目录&#xff1a; Fdog系列&#xff08;一&#xff0…

Qt之对话框(QDialog)

文章目录 一、对话框的概念二、与QWidget的区别三、对话框2种显示方法四、对话框返回值的概念本节示例 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、对话框的概念 对话框是和用户简短交互的一种窗口。如&#xff1a;登录界面&#xff0c;关于界…

《爱情公寓》电影,让我十年的情怀,一瞬间都喂了狗

点击上方“程序人生”&#xff0c;选择“置顶公众号” 第一时间关注程序猿&#xff08;媛&#xff09;身边的故事 作者 丁彦军 来源 恋习Python 如需转载&#xff0c;请联系原作者授权。 深陷抄袭之名、诉讼纠纷的《爱情公寓》终于上映了。 情怀粉们的力量不容小觑&#xff0c;…

长坡厚雪 一个智能手机的“大时代”迎面到来

作者 | 曾响铃 文 | 响铃说 “这是一个最好的时代&#xff0c;也是一个最坏的时代。 ” 在世界贸易关系、国际环境等不确定因素影响下&#xff0c;全球都蒙上了一层阴影。前不久召开的2023博鳌亚洲论坛主题就是“在不确定的世界中探寻确定性”&#xff0c;简单来说就是当前社…

《XP、面具框架玩机》小米手机玩机教程--菜鸟小回

《框架玩机》小米手机玩机教程 ChatGPT点击直接对话&#xff1a;小回公益GPT 注&#xff1a;刷机有风险&#xff0c;玩机需谨慎。 操作不当所造成后果与菜鸟小回无关&#xff01;&#xff01;&#xff01; 今天来分享小米手机玩机技巧&#xff0c;Magisk面具Xp框架! 可能你多上…

工程质量之研发过程管理需要关注的点

一、背景 作为程序猿&#xff0c;工程质量是我们逃不开的一个话题&#xff0c;工程质量高带来的好处多多&#xff0c;我在写这篇文章的时候问了一下CHATGPT&#xff0c;就当娱乐一下&#xff0c;以下是ChatGPT的回答&#xff1a; 1、提高产品或服务的可靠性和稳定性。高质量的系…

港联证券|存储概念再活跃,佰维存储盘中逼近涨停再创新高

存储概念11日盘中再度走强&#xff0c;截至发稿&#xff0c;佰维存储涨超19%&#xff0c;盘中迫临涨停再创上市以来新高&#xff0c;该股自上市以来累计大涨超500%&#xff1b;江波龙涨近15%盘中亦创出新高&#xff1b;此外&#xff0c;朗科科技涨近12%&#xff0c;同有科技涨近…