微信小程序——二维码推广海报

news2024/12/23 9:12:54

在这里插入图片描述😊博主:爱学习的Akali King
😊本文核心:本地图片和接口返回二维码制作一体化canvas海报

目录

  • 创建一个画布
  • 通过canvas API绘制图像
    • 细节1
  • 长按保存
    • 细节2

创建一个画布

在微信小程序中,我们使用<canvas>标签来创建一个画布

wxml 文件:

<view class="container">
  <canvas canvas-id="myCanvas" class="canvas"></canvas>
</view>

确立基本样式

wxss文件:

.container {
  width: 100%;
  height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
}

.canvas {
  width: 300px;
  height: 300px;
}


通过canvas API绘制图像

Page({
  onReady() {
    const ctx = wx.createCanvasContext('myCanvas');
    
    // 绘制背景图片
    wx.getImageInfo({
      src: '../img/bg.png', // 本地背景图片路径
      success(res) {
        ctx.drawImage(res.path, 0, 0, 300, 300);
        
        // 绘制二维码
        wx.request({
          url: '', // 替换成实际的二维码接口地址
          success(res) {
            wx.getImageInfo({
              src: res.data.qrcodeUrl,
              success(res) {
                // 绘制二维码到画布上
                ctx.drawImage(res.path, 100, 100, 100, 100);
                
                // 绘制文字
                ctx.setFontSize(16);
                ctx.setFillStyle('#ffffff');
                ctx.fillText('我的推广码', 120, 250);
                
                // 绘制完成并保存画布
                ctx.draw(false, () => {
                  wx.canvasToTempFilePath({
                    canvasId: 'myCanvas',
                    success(res) {
                      console.log('Canvas 生成临时图片路径:', res.tempFilePath);
                    },
                    fail(err) {
                      console.error('Canvas 保存失败:', err);
                    }
                  });
                });
              },
              fail(err) {
                console.error('获取二维码图片失败:', err);
              }
            });
          },
          fail(err) {
            console.error('请求二维码接口失败:', err);
          }
        });
      },
      fail(err) {
        console.error('获取背景图片信息失败:', err);
      }
    });
  }
});

细节1

我们先使用wx.createCanvasContext创建一个<canvas>的上下文对象,然后通过调用drawImage方法分别绘制背景图片和二维码到画布上。接着,我们使用fillText方法绘制一段文字,最后调用ctx.draw方法并设置reserve参数为false来完成画布的绘制。

当画布绘制完成后,我们可以通过wx.canvasToTempFilePath方法将画布保存为临时图片文件,并在成功回调中获取到临时图片的路径。你可以根据实际需求,将临时图片路径传递给其他接口或展示在界面上。


长按保存

要实现长按保存功能,我们在 <canvas> 上监听 touch 事件,并在长按事件触发时保存画布图像
首先在刚刚的<canvas>标签上,我们需要加个事件:

<view class="container">
  <canvas canvas-id="myCanvas" class="canvas" bindlongtap="saveImage"></canvas>
</view>

我们给 <canvas> 添加了 bindlongtap 事件绑定,并指定了对应的回调函数 saveImage。当用户长按 <canvas> 时,将会触发 saveImage 函数。

  saveImage() {
    wx.canvasToTempFilePath({
      canvasId: 'myCanvas',
      success(res) {
        const imageFilePath = res.tempFilePath;
        wx.saveImageToPhotosAlbum({
          filePath: imageFilePath,
          success() {
            wx.showToast({
              title: '保存成功',
              icon: 'success',
              duration: 2000
            });
          },
          fail(err) {
            console.error('保存图片到相册失败:', err);
          }
        });
      },
      fail(err) {
        console.error('Canvas 保存失败:', err);
      }
    });
  }

细节2

saveImage 函数中,我们使用 wx.canvasToTempFilePath 方法将画布保存为临时图片文件。在成功回调中,我们可以获取到临时图片的路径 res.tempFilePath,然后通过 wx.saveImageToPhotosAlbum 方法将图片保存到相册中。保存成功后,我们提示“保存成功”。

需要注意,在使用 wx.saveImageToPhotosAlbum 保存图片到相册时,需要用户进行授权。这个时候我们可以在小程序设置中添加相册权限,并根据实际需求处理授权相关逻辑。

我们也可以绑定bindlongpress事件,这就是最直接的长按事件

注意:长按事件默认的触发时间为 350ms,也可以通过 longpress-duration 属性来调整长按的触发时间,单位为毫秒。例如:

<canvas canvas-id="myCanvas" class="canvas"bindlongpress="downimg" longpress-duration="1000"></canvas>

那么如此一来就意味着长按画布一秒,触发函数downimg

最终实现效果:
在这里插入图片描述

当然在制作这个功能过程中遇到很多问题,总结一下一般就以下几个方面的问题:

跨域问题:如果你使用的二维码接口返回的图片是在不同的域名下,可能会存在跨域问题。你需要确保小程序的服务器配置允许跨域请求,或者使用合法的API 接口。

图片加载:在绘制 Canvas 之前,你需要确保所有要使用的图片都已经加载完成。你可以使用 wx.getImageInfo方法获取图片信息,或者使用 wx.downloadFile 下载网络图片。确保在绘制 Canvas 之前所有图片都已准备就绪。

图片路径:当绘制 Canvas时,你需要提供正确的图片路径。对于本地图片,你可以使用相对路径(相对于当前小程序页面)。对于接口返回的图片,你需要获取临时文件路径或下载到本地后再进行绘制。

异步加载:从网络加载图片或获取二维码等操作是异步的,确保在图片加载完成后再进行绘制。可以将图片加载操作放在回调函数或 Promise中,确保绘制操作在图片准备好后执行。

画布大小:根据设计需求,确保 Canvas 的大小与海报设计一致。你可以使用 <canvas> 标签的 width 和 height属性设置画布大小,并在绘制时按比例计算坐标。

坐标计算:根据海报的设计,确保各个元素的坐标正确。使用 ctx.drawImage 方法绘制图片时,可以设置目标位置和尺寸。使用ctx.fillText 方法绘制文字时,可以设置文本内容、字体大小、对齐方式等。

异常处理:在获取图片信息、请求接口或保存图片到相册时,都有可能出现异常。请确保适当处理这些异常,并给予用户合适的提示。

用户授权:保存图片到相册需要用户的授权。你需要在小程序设置中添加相册权限,并根据实际需求处理授权相关逻辑。

在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序web-view嵌入uni-app H5页面,通过H5页面跳转其他小程序如何操作?

1、H5页面代码 wx.miniProgram.reLaunch({ url: /pages/index/index?appId${您的微信小程序appId} });//触发小程序刷新页面获取appId 微信小程序appId查看方法&#xff1a; 1&#xff09;有后台登录权限的情况下&#xff1a;登录微信公众平台后&#xff0c; 微信公众平台微信…

linux——在VMware Workstation中配置固定IP

第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 切换到root用户下&#xff1a;用vim打开文件&#xff0c;进行上面五处修改。 改动后的文件为&#xff1a;

C++刷题第三天

203 移除链表元素 题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 解题思路…

python3开发-火车票分析助手

目录 背景 思路 步骤&#xff1a; 代码示例 总结 背景 随着人们出行需求的增加&#xff0c;火车票的购买和使用变得越来越普遍。然而&#xff0c;对于火车票的信息和数据进行分析&#xff0c;可以帮助我们更好地了解旅行趋势、优化行程规划等。而Python是一门功能强大的编程…

finalshell使用方法,前端vue更新服务器项目

首先我们看看finalshell的整体 上面是xshell一样&#xff0c;可以输命令 上面是WinSCP一样&#xff0c;可以直接拖文件&#xff0c;下载&#xff0c;上传&#xff0c;可视化视图 1.下载服务器文件 服务器文件通过Jenkins打包上去的&#xff0c;首先我们把文件下载到本地 点击…

skimage.io.imread与cv2.imread读取图片的通道顺序不同

先说结论 skimage.io.imread读取的通道顺序为RGB, opencv读取的通道顺序为BGR。 在基于通道处理数据时注意区别。 示例如下&#xff1a; 对于一张彩色的村庄鸟瞰图&#xff0c; 其中道路为蓝色&#xff0c;我们提取出蓝色通道 并将其转为二值图输出&#xff0c;已验证提取出的…

深度学习视角下的视频息肉分割

结直肠癌(CRC)是全球第二大致命癌症和第三大常见的恶性肿瘤&#xff0c;据估计每年会在全球范围内造成数百万人发病和死亡。结直肠癌患者在第一阶段的生存概率超过95%&#xff0c;但在第四和第五阶段却大幅下降到35%以下。因此&#xff0c;通过结肠镜、乙状结肠镜等筛查技术对阳…

mysql基础1——发展起源、数据类型、基础安装

文章目录 一、基本了解1.1 DBMS数据库管理系统1.2 主流关系型数据库1.3 数据表概念1.4 关系型数据库的组成1.5 数据类型1.5.1 数值型1.5.1.1 整数型1.5.1.2 小数型 1.5.2 字符串型1.5.3 日期时间型1.5.4 枚举型 二、yum安装mariadb三、二进制安装mysql 一、基本了解 前提背景&a…

Flutter嵌套地狱

override Widget build(BuildContext context) {return Column(children: <Widget>[Container(height: 45,child: Row(children: <Widget>[SizedBox(width: 30,),Icon(Icons.notifications,color: Colors.blue,),SizedBox(width: 30,),Expanded(child: Text(消息中…

华为OD机试真题 Python 实现【计算网络信号】【2023Q2 200分】

一、题目描述 网络信号经过传递会逐层衰减&#xff0c;且遇到阻隔物无法直接穿透&#xff0c;在此情况下需要计算某个位置的网络信号值。 注意&#xff1a; 网络信号可以绕过阻隔物array[m][n]的二维数组代表网格地图&#xff0c;array[i][j]0代表i行j列是空旷位置&#xff…

大众点评搜索基于知识图谱的深度学习排序实践

转子&#xff1a;https://tech.meituan.com/2019/01/17/dianping-search-deeplearning.html 1. 引言 挑战与思路 搜索是大众点评App上用户进行信息查找的最大入口&#xff0c;是连接用户和信息的重要纽带。而用户搜索的方式和场景非常多样&#xff0c;并且由于对接业务种类多…

自学黑客(网络安全),一般人我劝你还是算了吧(自学网络安全学习路线--第十八章 网络监听及防御技术)【建议收藏】

文章目录 一、自学网络安全学习的误区和陷阱二、学习网络安全的一些前期准备三、自学网络安全学习路线一、网络监听概述1、网络监听概念2、相关网络基础 二、监听技术1、局域网中的硬件设备简介2、共享式局域网的监听技术3、交换式局域网的监听技术 三、网络监听工具举例1、Tcp…

聚观早报 | 富士康被起诉;苹果公司股价再创新高

今日要闻&#xff1a;富士康被起诉&#xff1b;苹果公司股价再创新高&#xff1b;微信否认文件传输助手是真人&#xff1b;抖音外卖主攻60元以上套餐&#xff1b;消息称谷歌放弃研发AR智能眼镜 富士康被起诉 6 月 28 日消息&#xff0c;据外媒报道&#xff0c;美国电动卡车初…

服务注册与配置Nacos

服务注册与配置Nacos nacos 介绍nacos 特性nacos 的安装nacos 注册中心注册中心案例注册中心原理nacos服务分级存储模型 nacos 配置中心nacos 配置数据模型nacos 配置管理配置文件优先级nacos 配置持久化 nacos 集群部署 nacos 介绍 nacos 英文全称 Dynamic Naming and Config…

wsl子系统Ubuntu18.04,cuDNN安装

如果觉得本篇文章对您的学习起到帮助作用&#xff0c;请 点赞 关注 评论 &#xff0c;留下您的足迹&#x1f4aa;&#x1f4aa;&#x1f4aa; 本文主要wls子系统Ubuntu18.04安装cuDNN&#xff0c;安装cudnn坑巨多&#xff0c;因此记录以备日后查看&#xff0c;同时&#xff0…

【云原生 | 56】Docker三剑客之Docker Swarm高效使用

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

PPT怎么插入视频?3个视频插入方法分享!

Anna是个初入职场的新人&#xff0c;最近要进行工作汇报&#xff0c;需要制作PPT并插入相关的讲解视频。但她对PPT的运用不熟悉&#xff0c;不知道应该如何操作&#xff01;特此来询问应该如何在PPT中插入视频&#xff1f; 在演示文稿中插入视频可以使PPT更加生动有趣。无论是展…

如何克服自动化测试中的壁垒和问题?

随着自动化测试技术的快速发展和普及&#xff0c;自动化测试已经成为各个行业广泛应用的重要测试手段。然而&#xff0c;自动化测试中仍然存在壁垒和问题&#xff0c;这些问题可能对测试效果产生影响&#xff0c;甚至会影响整个项目的进程。在本文中&#xff0c;我们将探讨如何…

JavaScript进阶----《getter 和 setter 是什么》

前言&#xff1a; 这两个属性在学习前端的时候看到过&#xff0c;但是由于项目中没有用到过&#xff0c;所以一直没有细致的了解。今天 review 同事代码的时候&#xff0c;遇到了这个写法&#xff0c;看了半天也不知道如何处理。再不学习真的以后连别人的代码都不知道什么意思了…

报名 | AI驱动下的流程挖掘如何提升企业决策和运营效率?

随着人工智能&#xff08;AI&#xff09;技术的不断发展和普及&#xff0c;其在各个领域的应用也越来越广泛。其中&#xff0c;一项重要的应用就是利用AI技术驱动流程挖掘&#xff0c;以提升企业决策和运营效率。 流程挖掘是一种从事件日志中发现、监控和优化实际业务流程的技…