微信小程序预览图片和H5使用canvas实现图片+蒙层+文字

1、效果

2.H5实现

<!--* @Author: limingfang* @Date: 2024-05-20 10:26:51* @LastEditors: limingfang* @LastEditTime: 2024-05-21 16:31:11* @Description: 
-->
<!DOCTYPE html>  
<html lang="en">  
<head>  <meta charset="UTF-8">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <title>Canvas Draw Image and Elements</title>  <style>body {padding: 0;margin: 0;}</style>
</head>  
<body>  <canvas id="myCanvas" width="375" height="375"></canvas>  <script>  const canvas = document.getElementById('myCanvas');  const ctx = canvas.getContext('2d');  // 加载图片  const img = new Image();  img.onload = function() {  // 绘制图片  ctx.drawImage(img, 0, 0, 375, 375); // 参数:图片对象, x坐标, y坐标, 宽度, 高度  // 绘制文本  ctx.font = '28px Arial';  ctx.fillStyle = '#767B8D';  ctx.fillText('处方药', 146, 174);  ctx.fillText('依法不展示包装', 90, 222);  ctx.filter = 'blur(5px)';// 导出为图片(可选)  const dataUrl = canvas.toDataURL('image/png');  console.log(dataUrl,'dataUrl00000000000000000000');// 你可以使用dataUrl进行进一步的操作,例如将其设置为img元素的src属性  const imgElement = document.createElement('img');  imgElement.src = dataUrl;  imgElement.style.filter = 'blur(5px)';  document.body.appendChild(imgElement);  };  img.src = './4.jpg'; // 替换为你的图片路径  img.crossOrigin = "anonymous";//添加此行anonymous必须小写</script>  
</body>  
</html>

3.小程序实现

        <swiper indicator-color="#efeff4" indicator-active-color="#f16a33" circular="true" interval="2000" duration="600" bindchange="handleSwiperChange"><block wx:for="{{ json_data.goods[0].images }}" wx:key="index" wx:for-index="index" wx:for-item="item"><swiper-item><image src="{{ filter.formattingPictureThumbnail(['750', '750'], item.img_url) }}" class="swiper-image" data-index="{{index}}"catchtap="previewMedia"mode="aspectFit" /><view catchtap="previewMedia" data-index="{{index}}" wx:if="{{json_data.medicinesIsPrescribe&&mark.markFlag}}" class="d6-goods-img-no absolute left-0 top-0 w-full text-center box-border" style="-webkit-backdrop-filter: blur({{mark.markTransparency}}px);backdrop-filter:blur({{mark.markTransparency}}px);"><view catchtap="previewMedia" data-index="{{index}}"><view catchtap="previewMedia" data-index="{{index}}">处方药</view><view catchtap="previewMedia" data-index="{{index}}">依法不展示包装</view></view></view></swiper-item></block></swiper>
/*** 绘制canvas图片+图片阴影+蒙层* @returns */initCanvasImages(){let images = this.data.json_data?.goods && this.data.json_data?.goods[0]?.images || [];if(images.length <= 0) return;let sources = [];const _this = this;if (this.data.json_data.medicinesIsPrescribe && this.data.mark.markFlag) {// 获取canvas上下文  wx.createSelectorQuery().select('#goodsCanvas').fields({node: true,size: true,}).exec((canvasRes)=>{if(canvasRes.length <= 0) return;const canvas = canvasRes[0].node;const ctx = canvas.getContext('2d');// 设置canvas的宽度和高度与图像相同  canvas.width = 375;  canvas.height = 375;  images.forEach((item,index) => {images[index] = canvas.createImage();images[index].onload = function() {// 简单模糊处理(非高斯模糊): 只是多次绘制图片来模拟模糊效果for (let i = 0; i < _this.data.mark.markTransparency; i++) { // 重复次数越多,模糊效果越明显  ctx.globalAlpha = 1 / (i + 1); // 每次绘制时降低透明度  ctx.drawImage(images[index], i, i, 375, 375); // 参数:图片对象, x坐标, y坐标, 宽度, 高度  }  // 重置透明度  ctx.globalAlpha = 0.2;  ctx.filter = `blur(${_this.data.mark.markTransparency})px`;// 绘制文本  ctx.font = '28px Arial';ctx.fillStyle = '#767B8D';ctx.fillText('处方药', 146, 168);ctx.fillText('依法不展示包装', 90, 210);const dataUrl = canvas.toDataURL('image/png', 0.5); sources[index] = {url: dataUrl,type: item.img_type === 3 ? 'image' : 'video'};// 清除画布内容  ctx.clearRect(0, 0, 375, 375); // 清除画布上的所有内容,参数是画布的宽高  };images[index].src = item.img_url;})});} else {sources = images.map(item => ({url: item.img_url,  // 图片或视频的地址type: item.img_type === 3 ? 'image' : 'video' // 需要预览的资源类型}));}this.setData({canvasImages: sources});},/*** 预览图片/video*/async previewMedia(e) {let current = e.target.dataset.index;wx.previewMedia({sources: this.data.canvasImages, // 需要预览的资源列表current // 当前显示的资源序号})},

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

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

相关文章

C++ | Leetcode C++题解之第112题路径总和

题目&#xff1a; 题解&#xff1a; class Solution { public:bool hasPathSum(TreeNode *root, int sum) {if (root nullptr) {return false;}if (root->left nullptr && root->right nullptr) {return sum root->val;}return hasPathSum(root->left…

Java的类和对象

Java的类和对象 前言一、面向过程和面向对象初步认识C语言Java 二、类和类的实例化基本语法示例注意事项 类的实例化 三、类的成员字段/属性/成员变量注意事项默认值规则字段就地初始化 方法static 关键字修饰属性代码内存解析 修饰方法注意事项静态方法和实例无关, 而是和类相…

AI早班车5.25

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

C# 拓展方法(涉及Linq)

拓展方法 定义一个扩展方法使用扩展方法例如再举个例子终极例子 注意事项与Linq 在C#中&#xff0c;扩展方法是一种特殊的静态方法&#xff0c;允许开发者向现有类型“添加”新的方法&#xff0c;而无需修改该类型的源代码或创建新的派生类型。这种机制提供了一种更为灵活的方式…

Linux更改系统中的root密码

Linux里面的root密码忘记了怎么办&#xff1f; 1 更改系统中的 root 密码 &#xff08;1&#xff09;键盘 CtrlAltT 快捷键打开终端。 &#xff08;2&#xff09;在终端窗口中输入以下代码&#xff1a; sudo passwd root &#xff08;3&#xff09;输入锁屏密码 &#xf…

2024-05学习笔记

最近的学习大多都是和mysql的索引相关的 1.mvcc mvcc是不需要手动配置&#xff0c;是mysql的一个机制 在事务开启时&#xff0c;对涉及到的数据加一个隐藏列&#xff0c;隐藏列对应的值&#xff0c;就是事务id 如果当前是修改操作&#xff0c;就copy一份原来的数据到新的一行…

Topk问题以及二叉树的三种层序遍历和基本操作

一、Topk问题 1、问题描述 TOP-K问题&#xff1a;即求数据结合中前K个最大的元素或者最小的元素&#xff0c;一般情况下数据量都比较大。 比如&#xff1a;专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。 2、思路 对于Top-K问题&#xff0c;能想到的最简单直接的…

618快到了,送大家一款自动化脚本工具,一起薅羊毛

前言 一年一次的618活动来了&#xff0c;大家做好准备了&#xff0c;奇谈君为大家准备好用的618神器&#xff0c;解放双手&#xff0c;简单操作就可以把红包拿到手。 京淘自动助手 首次使用前需要进行设置 将手机的无障碍权限和悬浮窗权限打开 设置完成后&#xff0c;可以把…

什么是健康信息卡

健康档案信息卡是交由居民本人保管的个人健康信息卡片。 其内容包括&#xff1a;居民个人主要基本信息、健康档案编码、患有的重要疾病、过敏史以及紧急情况下的联系人及联系方式&#xff0c;还有所属基层医疗机构的责任医生、护士及联系电话等。它主要用于居民在复诊、转诊或接…

UTC与GPS时间转换-[week, sow]

UTC与GPS时间转换-[week, sow] utc2gpsgps2utc测试参考 Ref: Global Positioning System utc2gps matlab源码 function res utc2gps(utc_t, weekStart)%% parameterssec_day 86400;sec_week 604800;leapsec 18; % 默认周一为一周的开始if nargin < 2weekStart d…

算法打卡 Day10(栈与队列)-用栈实现队列 + 用队列实现栈

今天开始进入栈与队列啦&#xff01; 文章目录 栈与队列理论基础栈 Leetcode 232-用栈实现队列题目描述解题思路 Leetcode 225-用队列实现栈题目描述解题思路 首先我们来学习一下栈与队列的基础知识~ 栈与队列理论基础 栈与队列的区别是&#xff1a;栈是先进后出&#xff0c…

Python | Leetcode Python题解之第111题二叉树的最小深度

题目&#xff1a; 题解&#xff1a; class Solution:def minDepth(self, root: TreeNode) -> int:if not root:return 0que collections.deque([(root, 1)])while que:node, depth que.popleft()if not node.left and not node.right:return depthif node.left:que.appen…

cnVcXsrv 21.1.13.1—VcXsrv 21.1.13中文版本简单说明~~

对于VcXsrv的使用目的和用途相信大家都很了解。前不久VcXsrv做了更新&#xff0c;并且将项目托管到github上了。链接如下&#xff1a; VcXsrv: Windows X-server based on the xorg git sourceshttps://github.com/marchaesen/vcxsrv也可以简单查看如下链接&#xff1a; VcXs…

在matlab里面计算一组给定参数的方程的解

如&#xff1a; k (1:1024); f (x)(1-x-k.*x.^2); 在这段代码给出了一组函数&#xff0c;若需要计算f0&#xff0c;可以通过自带的函数实现&#xff1a; x0 zeros(length(k),1); options optimoptions(fsolve,Display,none,TolX,tol,TolFun,tol); tic for ik 1:length…

全网讲的最详细的Docker镜像分层存储原理

先说结论&#xff0c;容器镜像分层存储图示 欢迎关注 实验环境准备 当前实验docker版本24.0.7如下&#xff0c;当前docker版本使用overlay2机制存储镜像 Client: Docker Engine - CommunityVersion: 24.0.7API version: 1.43Go version: go1.20.10…

Three.js 研究:2、如何让动画线性运动

1、默认的动画含有加速度并非线性的 制作好的动画很明显是非线性的&#xff0c;这是一个运动环&#xff0c;为了让环运行线性进行如下设置。 2、设置动画成为线性动画

Vue从入门到实战Day07

一、vuex概述 目标&#xff1a;明确vuex是什么&#xff0c;应用场景&#xff0c;优势 1. 是什么&#xff1a; vuex是一个vue的状态管理工具&#xff0c;状态就是数据。 大白话&#xff1a;vuex是一个插件&#xff0c;可以帮助我们管理vue通用的数据&#xff08;多组件共享的…

解锁数据关联之道:SQL 表连接详解

文章目录 概述表关系横向连接内连接 inner join左连接 left join右连接 right join全连接 full join交叉连接 cross join 纵向合并UNION ALLUNION 概述 在数据处理、数据分析中常会用到表连接。表连接的作用是将多个表中的数据关联起来&#xff0c;以便在查询过程中获取更全面…

家政项目day2 需求分析(模拟入职后熟悉业务流程)

目录 1 项目主体介绍1.1 项目背景1.2 运营模式1.3 项目业务流程 2 运营端需求2.1 服务类型管理2.2 服务项目&#xff08;服务&#xff09;管理2.3 区域管理2.4 区域服务管理2.5 相关数据库表的管理2.6 设计工程结构2.7 测试接口&#xff08;接口断点查看业务代码&#xff09; 1…

【机器学习与大模型】开源大模型和闭源大模型:技术发展与社会责任的平衡点

目录 &#x1f4a1;引言✈️✈️一&#xff0c;开源大模型的优势与劣势✈️✈️1.1 优势&#xff1a;✈️✈️1.2 挑战和劣势&#xff1a; &#x1f680;&#x1f680;2. 闭源大模型的优势与劣势&#x1f680;&#x1f680;2.1 优势&#xff1a;&#x1f680;&#x1f680;2.2 …