uniapp H5生成画布,插入网络图片。下载画布

因为网络图片不能直接使用ctx.drawImage()插入。得使用uni.getImageInfo()方法下载后插入。
但是当画布中存在多张网络图片时,必须等待uni.getImageInfo()下载完成后才行。这样得下载套下载。太过于繁琐。所以定义了一个递归下载方法。同时避免下载图片异步,画布不显示的结果。

 

一、引用函数

/*** canvas文本自动换行,注意调用前要设置字体,例如: ctx.font = '12px Arial'* @param {*} ctx CanvasRenderingContext2D* @param {*} text  文本* @param {*} x * @param {*} y * @param {*} lw 所占宽度* @param {*} lh 行高* return 绘制文本所需的高度*/
const fillTextLineBreak = (ctx, text, x, y, lw, lh, color = '#000', font = '14') => {var i = 0;var n = 0;var r = -1;var initHeight = 0;ctx.font = "" + font + "px Arial"; //字体大小ctx.fillStyle = color; //字体颜色while (i < text.length) {while (ctx.measureText(text.substring(n, i)).width < lw && i < text.length) {i++}r++ctx.fillText(text.substring(n, i), x, y + lh * r)n = i}initHeight = lh * r;wx.setStorageSync('initHeight', initHeight);
}/*** 自定义函数roundRect* 画圆弧* ctx >> 画布*bg_x 图片的x坐标*bg_y 图片的y坐标*bg_w 图片宽度*bg_h 图片高度*bg_r 图片圆角**/
function roundRect(ctx, img, bg_x, bg_y, bg_w, bg_h, bg_r) {// 开始绘制ctx.save();ctx.beginPath();ctx.arc(bg_x + bg_r, bg_y + bg_r, bg_r, Math.PI, Math.PI * 1.5);ctx.arc(bg_x + bg_w - bg_r, bg_y + bg_r, bg_r, Math.PI * 1.5, Math.PI * 2);ctx.arc(bg_x + bg_w - bg_r, bg_y + bg_h - bg_r, bg_r, 0, Math.PI * 0.5);ctx.arc(bg_x + bg_r, bg_y + bg_h - bg_r, bg_r, Math.PI * 0.5, Math.PI);ctx.clip();ctx.drawImage(img, bg_x, bg_y, bg_w, bg_h);// 恢复之前保存的绘图上下文ctx.restore();
}/** 画布网络图片预处理*/
function canvasImage(that, Datas = {}, callback = null) {var i = Datas.i ? Datas.i : 0;var callback_Datas = Datas.callback_Datas ? Datas.callback_Datas : [];var data = Datas.data ? Datas.data : [];uni.getImageInfo({src: data[i],success(res) {i++;callback_Datas.push(res.path)if (i == data.length) {//回调函数if (callback) {callback(that, callback_Datas);return;}} else {//递归执行下一个上传canvasImage(that, {i,callback_Datas,data,}, callback);}},fail(e) {wx.hideLoading();//关闭画布弹窗that.posterHideCanvas();setTimeout(function() {wx.showToast({title: '生成失败,稍后再试',icon: 'none',})}, 0)}});
}

 二、index.vue

<view v-show="posterDatas.hidden" @touchmove="posterTouchMove" class="canvasMain flex center"><view class="box flex center column"><canvas :canvas-id="canvasId" :style="canvasStyle" class="canvas"></canvas><button v-if="posterDatas.buttonType==1" class="btn" @click="posterDownImage">点击保存图片到相册</button><button v-else-if="posterDatas.buttonType==2" class="btn">已保存到相册,快去分享吧</button><button v-else-if="posterDatas.buttonType==3" class="btn" open-type="openSetting"bindopensetting="posterOpenSetting">进入设置页,开启“保存到相册”</button><text class="iconfont icon-x" @click="posterHideCanvas"></text></view></view><style>
/* 海报 */
.canvasMain {position: fixed;left: 0;top: 0;width: 100%;height: 100%;background-color: rgba(0, 0, 0, 0.6);z-index: 9999;
}.canvasMain.hidden {top: 100%;left: 100%;
}.canvasMain .box {position: relative;
}.canvasMain .box .canvas {margin: 0;
}.canvasMain .box .btn {height: 40px;width: 280px;background-color: rgba(0, 0, 0, 0.3);border-radius: 40px;color: #fff;font-size: 15px;
}.canvasMain .box .btn {margin: 10px 0;padding-left: 0;padding-right: 0;
}.canvasMain .box .iconfont {font-size: 46rpx;color: #fff;
}
</style>

三、index.js

	data() {return {posterDatas: {width: 285, //画布宽度height: 406, //画布高度buttonType: 1,hidden: false, // 是否隐藏海报弹窗success: false, // 是否成功生成过海报},canvasId: 'firstCanvas',canvasStyle: 'width: 285px; height: 406px;', // 根据实际需要设置 canvas 的宽高};},//海报生成配置posterSetCanvas() {var that = thisvar posterDatas = that.posterDatas;var tempConfig = that.tempConfig;//展示海报弹窗that.posterDatas.hidden = true;util.showLoading('生成中');var userInfo = wx.getStorageSync('userInfo') || {};var Datas = {};Datas.i = 0;Datas.callback_Datas = [];Datas.data = [];Datas.data[0] = userInfo.touimg; //头像Datas.data[1] = app.globalData.swtCircle + "/mp_ewm_v2.php?act=getwxacode&tjrhao=" + (userInfo.tjrhao || '') + "&url=pages/home/home"; //小程序码util.canvasImage(that, Datas, function(that, canvasImage_arr) {//要延时执行的代码setTimeout(function() {//预处理画布网络地址图片var ctx = uni.createCanvasContext(that.canvasId, that);// 清除背景//ctx.clearRect(0, 0, posterDatas.width, posterDatas.height);// 绘制背景// ctx.fillStyle = "#fff";// ctx.fillRect(0, 0, posterDatas.width, posterDatas.height);var bgImg = '/static/images/yao_bj.png';// 绘制背景图ctx.drawImage(bgImg, 0, 0, posterDatas.width, posterDatas.height);//简介util.fillTextLineBreak(ctx, "邀请您使用" + tempConfig.appMain.name + "小程序", 100, 81, 150,20, '#fff',13);//标题文字ctx.font = "bold 18px PingFang SC";ctx.fillStyle = "#fff";ctx.textAlign = "start";ctx.fillText(userInfo.nickName_hai, 100, 60);util.roundRect(ctx, canvasImage_arr[0], 30, 35, 56, 56, 28);ctx.font = "bold 18px PingFang SC";ctx.fillStyle = "#0D7239";ctx.textAlign = "start";ctx.fillText('分享有礼 荐者有份', 70, 170);ctx.drawImage(canvasImage_arr[1], 65, 200, 160, 160);ctx.draw();wx.hideLoading();}, 200)});},//海报下载图片posterDownImage: function() {var that = thisutil.showLoading('保存中');var posterDatas = that.posterDatasuni.canvasToTempFilePath({canvasId: "firstCanvas",success(res) {console.log(res)wx.showToast({icon: 'none',title: '已保存到相册,快去分享吧',})posterDatas["buttonType"] = 2;that.posterDatas = posterDatas;// 在 h5 中,res.tempFilePath 返回的是 base64 类型要处理,通过 a 标签的形式下载var arr = res.tempFilePath.split(',');var bytes = atob(arr[1]);let ab = new ArrayBuffer(bytes.length);let ia = new Uint8Array(ab);for (let i = 0; i < bytes.length; i++) {ia[i] = bytes.charCodeAt(i);}var blob = new Blob([ab], {type: 'application/octet-stream'});var url = URL.createObjectURL(blob);var a = document.createElement('a');a.href = url;a.download = new Date().valueOf() + ".png";var e = document.createEvent('MouseEvents');e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false,false, 0, null);a.dispatchEvent(e);URL.revokeObjectURL(url);},fail(e) {console.log(e, "fail");util.showToast('保存失败,稍后再试”', 'none');that.posterHideCanvas();}})},//海报隐藏弹窗posterHideCanvas: function() {var that = this;that.posterDatas.buttonType = 1;that.posterDatas.hidden = false;},//海报弹窗禁止屏幕滚动posterTouchMove: function() {//在蒙层加上 catchtouchmove 事件//这里什么都不要放},

四、最终结果

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

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

相关文章

如何应对数字时代的网络安全新挑战?

随着数字时代的来临&#xff0c;我们迎来了无限的机遇&#xff0c;同时也伴随着网络安全领域新的挑战。网络攻击变得更加智能化和复杂化&#xff0c;威胁也在不断演化。为了应对这些新挑战&#xff0c;我们必须采取创新的网络安全策略和技术。本文将探讨数字时代网络安全的新挑…

通讯网关软件002——利用CommGate X2HTTP-U实现HTTP访问OPC UA Server

本文介绍利用CommGate X2HTTP-U实现HTTP访问OPC UA Server。CommGate X2HTTP是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现上位机通过HTTP来获取OPC UA Server的数据。 【解决方案】设置网关机…

安卓毕业设计各种app项目,Android毕设设计,Android课程设计,毕业论文

作为一位从事软件开发多年的专业人士&#xff0c;您积累了丰富的经验和技能&#xff0c;解决了许多不同类型的问题。除了开发原创项目&#xff0c;您还愿意分享您的知识&#xff0c;指导实习生和在校生。这种乐于助人的行为对于行业的发展和新一代软件开发者的成长都起着积极的…

[maven] maven 创建 web 项目并嵌套项目

[maven] maven 创建 web 项目并嵌套项目 这里主要就创建另外一个 web 项目&#xff0c;并且创建一个 parent 项目比较方便的管理一下两个子项目。 maven web 项目 web 创建和 quickstart 的过程是差不多的&#xff0c;只不过这里换乘 webapp&#xff0c;配置方便的话可以搞的…

3D目标检测框架 MMDetection3D环境搭建 docker篇

本文介绍如何搭建3D目标检测框架&#xff0c;使用docker快速搭建MMDetection3D的开发环境&#xff0c;实现视觉3D目标检测、点云3D目标检测、多模态3D目标检测等等。 需要大家提前安装好docker&#xff0c;并且docker版本> 19.03。 1、下载MMDetection3D源码 https://gith…

spring boot 整合多数据源

多数据源产生的场景 一般情况下&#xff0c;不会有多数据源这样的场景出现&#xff0c;但老项目或者特殊需求的项目&#xff0c;可能会有这样的场景 同一个应用需要访问两个数据库不用数据库中间件的读写分离 注入数据源选择的时机 声明两个数据源实例&#xff0c;在getConnect…

【多线程】CAS 详解

CAS 详解 一. 什么是 CAS二. CAS 的应用1. 实现原子类2. 实现自旋锁 三. CAS 的 ABA 问题四. 相关面试题 一. 什么是 CAS CAS: 全称Compare and swap&#xff0c;字面意思:”比较并交换“一个 CAS 涉及到以下操作&#xff1a; 我们假设内存中的原数据 V&#xff0c;旧的预期值…

pytorch生成CAM热力图-单张图像

利用ImageNet预训练模型生成CAM热力图-单张图像 一、环境搭建二、主要代码三、结果展示 代码和图片等资源均来源于哔哩哔哩up主&#xff1a;同济子豪兄 讲解视频&#xff1a;CAM可解释性分析-算法讲解 一、环境搭建 1&#xff0c;安装所需的包 pip install numpy pandas mat…

干净优雅的做iOS应用内全局交互屏蔽

本文字数&#xff1a;4930字 预计阅读时间&#xff1a;28分钟 01 交互屏蔽的需求 很多应用开发者都会遇到这样一个需求&#xff0c;当程序需要处理某个敏感的核心任务&#xff0c;或者执行某些动画时&#xff0c;需要杜绝一切外部干扰&#xff0c;优先保证任务的完成&#xff0…

thinkphp:查询本周中每天中日期的数据,查询今年中每个月的数据,查询近五年每年的总数据

一、查询本周中每天中日期的数据 结果&#xff1a; 以今天2023-09-14为例&#xff0c;这一周为2023-09-11~2023-09-07 代码 后端thinkphp: //查询本周每天的的总金额数 //获取本周的起始日期和结束日期 $weekStart date(Y-m-d, strtotime(this week Monday)); $weekEnd …

centos 下 Makefile 独立模块编译ko

1、安装编译内核环境包 编译需要用到kernel 源码&#xff0c;centos 下需先安装 kernel-devel 包&#xff0c;要下与自己kernel 对应版本 yum install kernel-devel 2、首先从内核或自己写的模块&#xff0c;发到编译环境中 注&#xff1a;就像我自己拷贝一个 bcache 驱动的目…

msvcp120.dll怎么修复?msvcp120.dll丢失的解决方法

在当今这个信息化的时代&#xff0c;电脑已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;随着电脑技术的不断发展&#xff0c;我们也会遇到各种各样的问题。其中&#xff0c;msvcp120.dll丢失是一个常见的问题。一、msvcp120.dll 文件介绍 1 msvcp120.dll 文件的定…