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

news2024/10/5 21:25:26

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.coloradmin.cn/o/1695746.html

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

相关文章

自动驾驶场景中的长尾问题怎么解决?

自动驾驶长尾问题是指自动驾驶汽车中的边缘情况&#xff0c;即发生概率较低的可能场景。感知的长尾问题是当前限制单车智能自动驾驶车辆运行设计域的主要原因之一。自动驾驶的底层架构和大部分技术问题已经被解决&#xff0c;剩下的5%的长尾问题&#xff0c;逐渐成了制约自动驾…

Rustdesk客户端源码编译

1.安装VCPKG windows平台vcpkg安装-CSDN博客 2.使用VCPKG安装: windows平台vcpkg安装-CSDN博客 配置VCPKG_ROOT环境变量: 安装静态库: ./vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static 静态库安装成…

Polar 上传

Polar 上传 开题&#xff0c;是一个文件上传界面 对文件后缀有过滤 测试了一下是黑名单&#xff0c;过滤了php相关的文件&#xff0c;但是没过滤.ini、.htaccess后缀的文件 对内容的过滤是<?、file&#xff0c;所以不能用.user.ini配置文件绕过 我们选择使用.htaccess配置…

React(四)memo、useCallback、useMemo Hook

目录 (一)memo API 1.先想一个情景 2.用法 (1)props传入普通数据类型的情况 (2)props传入对象的情况 (3)props传入函数的情况 (4)使用自定义比较函数 3.什么时候使用memo&#xff1f; (二)useMemo Hook 1.用法 2.useMemo实现组件记忆化 3.useMemo实现函数记忆化 …

python列表生成式的妙用:区间内奇数求和

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、案例背景 三、实现步骤 四、案例验证 五、总结 一、引言 在Python编程中&a…

vue实现页面渲染时候执行某需求

1. 前言 在之前的项目中&#xff0c;需要实现一个监控token是否过期从而动态刷新token的功能&#xff0c;然而在登录成功后创建的监控器会在浏览器刷新点击或者是通过导航栏输入网址时销毁... 2. 试错 前前后后始过很多方法&#xff0c;在这里就记录一下也许也能为各位读者排…

按月爬取天气数据可视化展示

从天气网分析,可以查询每个月的天气情况,这里按照url规则,传入年月,获取数据,最后进行可视化展示,最终效果: 下面是获取过程: 第一步: import requestsdef get_weather(month):url = f"https://lishi.tianqi.com/nanning/{month}.html"response = reques…

I.MX6ULL的官方 SDK 移植实验

系列文章目录 I.MX6ULL的官方 SDK 移植实验 I.MX6ULL的官方 SDK 移植实验 系列文章目录一、前言二、I.MX6ULL 官方 SDK 包简介三、硬件原理图四、试验程序编写4.1 SDK 文件移植4.2 创建 cc.h 文件4.3 编写实验代码 五、编译下载验证5.1编写 Makefile 和链接脚本5.2编译下载 一、…

运维 之 大文件分片刻录光盘

需求 因有些企业中涉及设备只能通过光盘介质方式拷贝文件&#xff0c;然而采购的单张光盘又不能确保存放下一些较大的文件&#xff0c;所以只能通过分片的方式逐个光盘存储。 Windows处理 1、安装压缩软件&#xff08;自行选择&#xff0c;这里使用WinRAR&#xff09;、Ultr…

在CentOS7上安装Oracle11

一、概述 Oracle有两种安装方式&#xff0c;桌面安装和静默安装。这里我采用桌面安装的方式。 不得不说&#xff0c;Oracle真的是我目前为止安装过的最麻烦的软件没有之一&#xff0c;比K8S还麻烦&#xff0c;Oracle&#xff0c;真有你的&#xff01;废话不多说&#xff0c;臭…

多级留言/评论的功能实现——Vue3前端篇

文章目录 思路分析封装组件父组件模板逻辑样式 子组件——二级留言模板逻辑样式 子组件——三级留言以上模板逻辑样式 留言组件的使用 写完论文了&#xff0c;来把评论的前端部分补一下。 前端的实现思路是自己摸索出来的&#xff0c;没找到可以符合自己需求的参考&#xff0c;…

C++的类和对象

C面向对象的三大特性&#xff1a;封装&#xff0c;继承&#xff0c;多态 万事万物皆可为对象&#xff0c;有其相应的属性和行为 一、封装 1.1 封装的意义 将属性和行为作为一个整体&#xff0c;表现生活中的事物 将属性和行为加以权限控制 在设计类的时候&#xff0c;属性…

需求分析部分图形工具

描述复杂的事物时,图形远比文字叙述优越得多,它形象直观容易理解。前面已经介绍了用于建立功能模型的数据流图、用于建立数据模型的实体-联系图和用于建立行为模型的状态图,本节再简要地介绍在需求分析阶段可能用到的另外3种图形工具。 1 层次方框图 层次方框图用树形结…

开源模型应用落地-LangSmith试炼-入门初体验-数据集评估(三)

一、前言 LangSmith是一个用于构建生产级 LLM 应用程序的平台&#xff0c;它提供了调试、测试、评估和监控基于任何 LLM 框架构建的链和智能代理的功能&#xff0c;并能与LangChain无缝集成。通过使用LangSmith帮助开发者深入了解模型在不同场景下的表现&#xff0c;让开发者能…

论文阅读_管理模型的记忆_MemGPT

1 2 3 4 5 6 7 8 9英文名称: MemGPT: Towards LLMs as Operating Systems 中文名称: MemGPT&#xff1a;将LLMs打造成操作系统 链接: https://arxiv.org/abs/2310.08560 代码: https://github.com/cpacker/MemGPT 作者: Charles Packer, Sarah Wooders, Kevin Lin, Vivian Fang…

推荐10款优秀的组件库(一)

1.Ant Desgin UI 网址&#xff1a; https://ant-design-mobile.antgroup.com/zh Ant Design - 一套企业级 UI 设计语言和 React 组件库 "Ant Design Mobile"是一个在线的移动端Web体验平台&#xff0c;让你探索移动端Web的体验极限。 添加图片注释&#xff0c;不…

安全设计 | 安全设计不得马虎!微软STRIDE威胁建模方法让你事半功倍,快速发现应用安全隐患!

STRIDE威胁建模方法最早发表于2006年11月的《MSDN杂志》&#xff0c;作者是微软的工程师Shawn Hernan、Scott Lambert 、Tomasz Ostwald 和 Adam Shostack。那我们为什么要进行威胁建模&#xff1f; 如何使用数据流图对系统进行威胁建模&#xff1f;如何减轻威胁&#xff1f;接…

STM32F1之OV7725摄像头

目录 1. 摄像头简介 2. OV7725 摄像头简介 3. OV7725 引脚 4. OV7725 功能框架图 5. SCCB时序 5.1 SCCB 的起始、停止信号及数据有效性 5.2 SCCB 数据读写过程 1. 摄像头简介 在各类信息中&#xff0c;图像含有最丰富的信息&#xff0c;作为机…

从0开始学统计-蒙彼利埃尔悖论与条件概率

1.什么叫均衡可比&#xff1f; "均衡可比"指的是在进行比较时&#xff0c;确保所比较的对象或情况具有相似的特征和条件&#xff0c;以保持比较的公正性和准确性。这个概念通常应用于研究设计和数据分析中&#xff0c;以确保比较结果的可信度和有效性。 在研究中&a…

HTML静态网页成品作业(HTML+CSS)——企业酒店官网网页(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有5个页面。 二、作品演示 三、代…