用canvas绘制微信小程序海报页面并保存相册-适用微信原生

微信小程序绘制海报并保存相册

tip:代码中使用的是uni的api 如果使用原生微信小程序开发,可以把uni更换成wx使用

文章目录

  • 微信小程序绘制海报并保存相册
  • 前言
  • 一、分析需求
  • 二、准备数据
  • 三、编码开始
      • html部分
        • 解析:
      • js部分
        • 1、准备好数据后开始绘制
        • 解释:
        • 2、保存图片
        • 解析:
  • 总结


前言

本片文章主要是把我工作中实际用到,可以整合出来的功能,做一个总结和讲解。

1、如何使用canvas
2、canvas绘制后如何生成图片
3、将图片保存到相册
4、难点:如何解决canvas层级高于position定位层级问题,如何适配不同屏幕大小比例


一、分析需求

两种方案:

  1. 进入页面先绘制canvas,点击按钮后再生成图片并保存相册
  2. 进入页面先绘制canvas,并生成图片,点击按钮直接保存图片到相册

我这边使用的是第一种方式,看实际需求。(其实没多大区别)

二、准备数据

在开始绘制canvas之前首先要,分析页面中用到了哪些内容:

  1. 背景图片
  2. 二维码图片
  3. 关于海报的一些描述性文案

注意:
1、由于这些数据可能不是页面写死的内容,是根据api返回的数据,所以需要在绘制canvas之前就先准备好从api返回的数据。
2、需要考虑同步问题


三、编码开始

先看下页面图片样式
效果图

html部分

<canvas :style="{height:pageHeight,width: _width +'px'}" canvas-id="mycanvas" />
<cover-view @tap="saveImg"><cover-image src="btn_img.png"></cover-image>
</cover-view>

解析:

1、首先需要准备一个canvas用于绘制页面内容的载体,id是唯一标识
2、需要一个按钮用于保存图片,但是发现即使用绝对定位调整层级还是不能将按钮显示到canvas上层,所以借助于官方提供的覆盖原生组件的方法。cover-viewcover-image

js部分

这里只说代码重点部分。

页面中用到的变量可以自行修改,至于变量的初始值都可以是空字符串

1、准备好数据后开始绘制

onReady() {// 为了兼容不同机型页面大小,所以需要先获取到页面宽高this.getSysInfo()
},
getSysInfo() {/*获取手机宽高*/let that = thislet imgUrl = this.imageUrllet qrcodeUrl = this.codeUrluni.getSystemInfo({success(res) {console.log('屏幕宽度', res)that._width = res.windowWidththat._heigth = res.windowHeight// 获取图片信息生成canvas// 因为这里用的网络图片所以需要先获取本地网络图地址that.getImginfo([imgUrl, qrcodeUrl], 0);}})
},
getImginfo(urlArr, _type) {let that = this;uni.getImageInfo({src: urlArr[_type],success: function(res) {//res.path是网络图片的本地地址if (_type === 0) { //that.localImageUrl = res.paththat.getImginfo(urlArr, 1)} else {//二维码that.localCodeUrl = res.path// 创建canvas图片that.createNewImg();}},fail: function(res) {//失败回调console.log('错误', _type, res)}});
},
createNewImg() {let that = this;let ctx = uni.createCanvasContext('mycanvas');// 绘制背景ctx.drawImage(this.localImageUrl, 0, 0, this._width, this._heigth - 44 - this.statusBarHeight);// 绘制二维码区域ctx.lineJoin = "round";ctx.lineWidth = 12;ctx.setFillStyle('#FFFFFF')ctx.setStrokeStyle('#FFFFFF')// 二维码区域y坐标const yPosition = this._heigth - 44 - this.statusBarHeight - this.remSize(98) - 100ctx.strokeRect(this.remSize(24), yPosition, this.remSize(326), this.remSize(98));ctx.fillRect(this.remSize(24), yPosition, this.remSize(326), this.remSize(98));// 绘制二维码const yPosition2 = yPosition + 4ctx.drawImage(this.localCodeUrl, this.remSize(28), yPosition2, this.remSize(90), this.remSize(90));//二维码区域文字let title1 = this.tips.title1;let title2 = this.tips.title2;let title3 = this.tips.title3;// 文字一ctx.setFontSize(this.remSize(14));ctx.setFillStyle('#333333');ctx.fillText(title1, this.remSize(128), yPosition + this.remSize(30));// 文字二三ctx.setFillStyle('#B8B8B8');ctx.setFontSize(this.remSize(12));ctx.fillText(title2, this.remSize(128), yPosition + this.remSize(62));ctx.fillText(title3, this.remSize(128), yPosition + this.remSize(85));// 绘制ctx.draw();//将生成好的图片保存到本地uni.canvasToTempFilePath({canvasId: 'mycanvas',success: (res)=> {that.loadImagePath = res.tempFilePath},fail: (res)=> {console.log(res);}});
},
// 缩放比例
let scalePage = uni.getSystemInfoSync().windowWidth / 375remSize(num) {return num * scalePage
},

解释:

1、uni.createCanvasContext创建canvas上下文,用于操作绘制具体图片和文字
2、ctx.drawImage用于绘制图片
3、ctx.setFillStyle用于绘制填充色
4、ctx.setStrokeStyle用于绘制边框颜色
5、因为canvas不能绘制圆角实心矩形,所以取巧的方式,就是用圆角矩形和实心矩形覆盖的方式,效果见上图。
6、ctx.strokeRect绘制矩形空心
7、ctx.fillRect绘制矩形实心
6、ctx.setFontSize ctx.setFillStyle ctx.fillText 绘制文字大小,颜色,位置
7、ctx.draw() 把所有的上下文内容,绘制到canvas上面
特别说明:

  1. remSize方法,根据设计稿去设置图片大小和文案的位置比例,我这边是根据375像素的宽度计算比例。
  2. 这些api具体使用方法,可以参考官方文档,这里就不一一列举了。

2、保存图片

//点击保存到相册
saveImg() {uni.saveImageToPhotosAlbum({filePath: this.loadImagePath,success(res) {uni.showToast({title: '已保存到相册',icon: 'success',duration: 3000})}})
},

解析:

1、因为保存按钮是固定定位,并且按钮并非canvas绘制内容,所以保存图片的时候并不会有按钮。
2、需要注意的是,保存相册是需要相册保存权限的,这个可以看文档自己去设置。

总结

上面的说的覆盖问题,还可以是先使用canvas把直接生成图片,然后在页面上直接显示生成好的图片。
如有问题,欢迎指正修改。

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

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

相关文章

火爆的AI绘画+红包封面+春联+节日头像+创作者入驻小程序源码

2023年新年&#xff0c;红包封面皮肤在前几年一直都很火爆&#xff0c;每次过年过节&#xff0c;几乎家家都会互发红包进行庆祝贺岁&#xff0c;这个时候一个简单的红包封面就会显得多么的与众不同。 Ai文字绘画&#xff0c;&#xff0c;&#xff0c; 红包封面领取 小程序 …

ChatGPT死活不认27能被3整除,网友:不是说AI要统治世界了吗?

Alex 羿阁 发自 凹非寺量子位 | 公众号 QbitAI 让众人疯狂的网红AI ChatGPT&#xff0c;原来也有明显的短板&#xff1f; 一段“网友调教这只AI”的聊天记录&#xff0c;在网上传开了。 可以看到&#xff0c;AI起初居然说27是个质数。 在网友向其提出质疑后&#xff0c;AI仍嘴硬…

OpenAI 重磅更新 变得更强啦 | 包括更多可控的 API 模型、函数调用能力、更长的上下文和更低的价格

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 OpenAI 官网&#xff1a;https://openai.com/blog/function-calling-and-other-api-updates 功能调用和其他 API 更新。OpenAI 宣布更新&#xff0c;包…

自己写的一段预测双色球号码的Java代码

原理是根据双色球开奖的历史数据&#xff0c;根据各种易经八卦&#xff0c;天时等随机因素预测下一期的双色球号码。 完整代码在我的github上&#xff1a; MainFrame.java是主程序&#xff1a; package ball;public class MainFrame {public static void main(String[] args) …

20211217使用python3通过最近6期的双色球开奖结果预测新一期的号码

20211217使用python3通过最近6期的双色球开奖结果预测新一期的号码 酬金/劳务费用&#xff1a;小奖请吃饭。 大奖给你技术支持费用&#xff01; 按照你如今加班工资的2倍计酬&#xff01; 第一步&#xff0c;希望2周完成&#xff0c;大概完成时间2021-12-15&#xff1a; a1*x1…

《LSTM神经网络和双色球预测例子》

前言&#xff1a; 书接上回&#xff0c;通过把历年来的双色球蓝球数据爬取&#xff0c;可以看出&#xff0c;每期双色球蓝球之间并无任何关系&#xff0c;但仍存在问题&#xff1a; 决定蓝球数字可能并非取决于上一期蓝球的数据&#xff0c;可能取决于当期红球的数据&#xff0…

《基于LSTM神经网络的双色球蓝球数字预测》

结论&#xff1a;没有任何作用&#xff0c;基本可以断定这是真正随机的数字。 LSTM神经网络&#xff0c;单步预测&#xff0c;循环2000次&#xff0c;100个神经元&#xff0c;无dropout。 蓝线&#xff1a;最近50期蓝球数字 橙线&#xff1a;LSTM网络预测数字 绿线&#xff1a…

数学建模预测模型实例(三)---双色球概率预测模型

双色球概率预测模型 数学建模预测模型实例&#xff08;一&#xff09;—大学生体测数据模型 数学建模预测模型实例&#xff08;二&#xff09;—表白墙影响力量化模型 python预测算法—线性回归 双色球概率预测模型 前言 最近新晋彩民佩瑞对于双色球产生了极为浓厚的兴趣&am…

AIGC 工具推荐:利用 AI 提高工作效率的利器

人工智能&#xff08;AI&#xff09;正在改变我们的生活&#xff0c;使我们的工作更加高效和智能化。在这个快速发展的领域中&#xff0c;有许多 AI 实用工具可以帮助我们更好地完成工作。在未来熟练使用各种 AI 工具优化你的工作流并提高工作效率将是每个人的必备技能&#xf…

Ubuntu Go语言环境配置【GPT-4版】

目录 go语言的培训网课安装goGPT-4给出的过程在VSCode里怎样正确配置好Go的调试相关设置&#xff1f;如果我在Visual Studio Code中安装Go语言的相关工具总是失败怎么办&#xff1f;我已重启Visual Studio Code&#xff0c;接下来应该怎样检查日志&#xff1f;如果我还是不能成…

Monica - 你的 GPT-4 人工智能助手

Monica介绍 官方地址&#xff1a;https://monica.im/?cX0OHBN1S &#xff08;仅限今天&#xff0c;通过这里注册可免费获取100次Monica查询&#xff09; Monica 是一款由 ChatGPT API 提供支持的扩展程序&#xff0c;它可以与您讨论任何事情&#xff0c;使用 80 多个模板生成文…

初学者使用Auto-GPT入门:设置和使用

初学者使用Auto-GPT入门&#xff1a;设置和使用 简介&#xff1a;1. 快速演示2. 要求3. 设置OpenAI使用限制&#xff08;可选&#xff09;4. 安装Python5. 安装Git6. 安装 virtualenvwrapper&#xff08;可选&#xff09;6.1 使用 pip&#xff0c;您可以轻松地在 Python 环境中…

最近热门话题-Auto GPT 初学者Auto GPT 入门:设置和使用

Auto-GPT 是一个实验性的开源应用程序&#xff0c;展示了著名的 GPT-4 语言模型的功能。 它使用 GPT-4 执行复杂的任务并实现目标&#xff0c;而无需太多人工输入。 Auto-GPT将OpenAI的GPT模型的多个实例链接在一起&#xff0c;允许它做一些事情&#xff0c;比如在没有帮助的…

GPT国内使用

国内可用的 ChatGPT 替代 列表 功能和使用 顺便推荐 列表https://chatgpt.qdymys.cn/ &#xff1a;三小时只能用10次 https://alllinkai.com/&#xff1a;体验完&#xff0c;要登录&#xff0c;不推荐 https://gpttalk.live/ &#xff1a;每天限制使用次数 https://chatgpt-…

信息收集----浏览器,网络空间搜索引擎

目录 一.浏览器搜索 1.什么是Google Hacking 2.高级搜索 3.示例 4.工具 二.网络空间搜索引擎 1.什么是网络空间搜索引擎 2.Shodan的使用 3.Censys&#xff0c;Zomeye,Fofa介绍 1.Censys 2.zoomeye 3.fofa 4.总结对比 5.基于网络空间搜索引擎的工具 一.浏览器搜索 1…

VC++实现双人对决的围棋程序,阿尔法狗围棋

可以双人对决的VC围棋程序&#xff0c;送给我梦中的情人。虽然程序不很复杂&#xff0c;但必竟是我自己亲手写噢&#xff0c;而且还得到了女朋友的夸张&#xff0c;通过编写这个小程序&#xff0c;让我对VC有了更深层的了解&#xff0c;想要的下载。游戏打开后可以选择适合15、…

训练策略网络和价值网络

阿尔法狗2016版本使用人类高手棋谱数据初步训练策略网络&#xff0c;并使用深度强化学习中的REINFORCE算法进一步训练策略网络。策略网络训练好之后&#xff0c;使用策略网络辅助训练价值网络。零狗&#xff08;AlphaGo Zero&#xff09;使用MCTS控制两个玩家对弈&#xff0c;用…

计算机永远无法超越人类——从李世石与阿尔法的人机大战中想到的

转载请注明出处&#xff1a;http://blog.csdn.net/dongdong9223/article/details/52214884 本文出自【我是干勾鱼的博客】 大家好&#xff01;我是海东。前一阵子李世石与谷歌阿尔法的围棋人机大战引起了大家的广泛关注&#xff0c;今天我们就来聊聊计算机与人类的较量。 首先海…

机巧围棋(CleverGo)项目总览及介绍

1. 项目简介 2016年3月&#xff0c;阿尔法狗以4:1战胜围棋世界冠军李世石。自此开始&#xff0c;深度强化学习受到空前的关注并成为AI领域的研究热点&#xff0c;彻底引爆了以深度学习为核心技术的第三次人工智能热潮。 机巧围棋利用PythonPygamePaddlePaddle基于AlphaGo Zer…

算法高级(45)-阿尔法狗到底有多厉害?

1997年5月11日&#xff0c;一台名为“深蓝”的超级电脑将棋盘上的一个兵走到C4位置时&#xff0c;人类有史以来最伟大的国际象棋名家卡斯帕罗夫不得不沮丧地承认自己输了。世纪末的一场人机大战终于以计算机的微弱优势取胜。 当然&#xff0c;国际象棋这样的棋类比赛&#xff…