vue项目将多张图片生成一个gif动图

news2024/11/23 12:39:36

当前做项目有一个需求是将多张图片生成一个gif动图的形式

类似下面图片几张图片叠加生成一个gif动图

图片涉及工作隐私,就不公开啦

 我们要引入一个gif.js的引入包,但是他没有直接引入的方式,只能从官方下载文件包,下载地址:git地址

下载好的包找到下面这个两个文件,引入到本地项目中去

将引入进来的两个包中的最后一行代码注释,避免映射

 然后:这里需要对gif.worker进行封装  

在gif.worker.js文件最后声明一个函数,将该文件除了注释部分的代码之外的所有代码复制变成文本,然后给一个变量  

生命的函数将复制的代码文本转化成 blob,然后转化成url的形式

export const gifWorkerContent = ` gif.worker.js文件代码(不要粘贴注释部分)  `

export const getGifWorker = () => {

  const blob = new Blob([gifWorkerContent])

  return window.URL.createObjectURL(blob)

}

然后在需要生成gif的单页面进行引入

 

引入完成之后, 

进行函数处理, 需要获取到所有的地图图片canvas元素,然后通过canvas转换成图片

toGif(item, index) {
      const _this = this
      this.imgs = []
      const temDiv = document.getElementById(item + index)
      this.mapOptionsList[item].forEach((items, index) => {
        const div = document.getElementById(item + index)
        const temimg = div.querySelector('canvas')
        this.imgs.push(temimg) // this.imgs这个数组是所有需要生成gif的图片的集合
      })
      // 生成GIF
      try {
        const { width, height } =
         temDiv.getBoundingClientRect() // 这里定义一下gif图片的大小
        const gif = new GIF({
          workers: 2,
          quality: 10,
          width,
          height,
          workerScript: getGifWorker() // 自定义worker地址
        })
        // 对所有的图片进行处理,利用canvas绘制图片
        this.imgs.forEach((img, index) => {
          const cv = document.createElement('canvas')
          cv.width = width
          cv.height = height
          const ctx = cv.getContext('2d')
          ctx.fillStyle = '#fff'
          ctx.fillRect(0, 0, width, height)
          ctx.drawImage(img, -20, 0, img.width, img.height)// 这里的img参数内容 要是canvas或者svg或者img的dom元素
          ctx.fillStyle = '#000' // 这里的fillStyle要注意却分大小写
          ctx.font = '20px normal'
          const temname = _this.mapOptionsList[item][index].title.name
          ctx.fillText(temname, 200, 25)
          ctx.fillStyle = '#000' // 这里的fillStyle要注意却分大小写
          ctx.font = '20px normal'
          const temtime = _this.mapOptionsList[item][index].title.time
          if (index == 0) {
            ctx.fillText(temtime, 110, 55)
          } else {
            ctx.fillText(temtime, 150, 55)
          }
          gif.addFrame(cv, { delay: 1000 })
        })
        // 渲染gif
        gif.render()
        // 图片合成后
        gif.on('finished', (blob) => {
          const a = document.createElement('a')
          a.href = URL.createObjectURL(blob)
          a.download = _this.mapOptionsList[item][index].title.text
          a.click()
          gif.abort()
        })
      } catch (error) {
        console.log(error)
      }
    },

 然后就可以生成gif图片啦 可以看一下下面的图片哦

图片涉及工作隐私就不公开啦

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

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

相关文章

面向航空智能制造的边缘计算光交换技术研究

源自:航空科学技术 作者:赵俊 吴宝锋 徐盛果 孙小菡 摘 要 面向航空智能制造大批量数据采集与传递的实时性要求,提出一种基于异步光分组交换(optical packet switching,OPS)技术的具有多级管理能力的边缘计算系统…

关于千兆和万兆电口模块,你了解多少?

网络技术的不断发展,使得传输速度的要求越来越高。为了满足这种需求,千兆和万兆电口模块逐渐成为了现代网络设备中的重要组成部分。 一、什么是千兆电口模块? 千兆电口模块是一种用于网络设备之间传输数据的光转电模块,它们可以…

谷粒商城二十四Sentinel限流熔断降级

我们在秒杀服务加的以上所有手段都是为了快,除了快之外,我们还需要保证稳定。 我们即使再快也会有一个极限值,现在假设单机下每秒处理一万个单,这已经是超高的处理能力了,秒杀服务上了五台服务器,有三台掉…

【直播预告】“知·道关基 行·筑安全”关基保护线上研讨会将于5月5日、5月9日开启

随着信息化建设的不断发展,网络安全形势日趋严峻,围绕网络空间主导权和控制权的竞争加剧,全球网络安全博弈日趋激烈。 关键信息基础设施是数字经济社会运行的神经中枢,事关国家网络安全和数据安全,日益成为国家网络空…

BetaFlight统一硬件配置文件研读之serial命令

BetaFlight统一硬件配置文件研读之serial命令 1. 源由2. 代码分析3. 实例分析4. 配置情况5. 参考资料 统一硬件配置文件的设计是一种非常好的设计模式,可以将硬件和软件的工作进行解耦。 1. 源由 cli命令中serial是对UART串口的配置,通常情况下BetaFli…

信创赛道全国二等奖!创邻科技国产化解决方案再获佳绩

4月27日,第六届数字中国建设峰会在福建省福州市开幕。本届峰会以“加快数字中国建设,推进中国式现代化”为主题,以宣传贯彻落实《数字中国建设整体布局规划》为主线,集中展示数字中国建设最新成果,分享发展经验&#x…

C++题解:静态区间最大值

题目链接 P3865 ST 表 题目描述 这是一道 ST 表经典题——静态区间最大值 请注意最大数据时限只有 0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O ( 1 ) O(1) O(1)。若使用更高时间复杂度算法不保证能通过。 如果您认为您的代码时间复杂度正…

java版企业电子招投标采购系统源码——功能模块功能描述+数字化采购管理 采购招投标

​ 功能模块: 待办消息,招标公告,中标公告,信息发布 描述: 全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力,为外…

ansible常见概念总结

目录 1、play和playbook和role 2、幂等性 3、清单 4、配置文件(ansible.cfg) 5、变量 5.1 在playbook中使用变量: 5.2 在playbook中使用变量文件: 6、事实 7、循环 8、处理程序 9、块 10、动态清单文件 11、角色 1、play和playbook和role …

本地事务,分布式事务(Seata)

本地事务 四大特性ACID A:原子性(Atomicity):事务是不可分割的最小操作但愿,要么全部成功,要么全部失败 C:一致性(Consistency):事务完成时,必须使所有数据都保持一致状态 l:隔离性(Isolation):数据库系统…

[架构之路-188]-《软考-系统分析师》-3-操作系统 - 图解页面替换算法LRU、LFU

目录 一、内存置换算法的缘由 二、算法详解 2.1 最佳页面置换算法(OPT) 》 理论上的最优,实际无法保证 2.2 先进先出置换算法(FIFO)-- 按加载时间/最早访问时间排序 2.3 最近最久未使用的置换算法(L…

JDK、JRE 和 JVM 之间的区别

虚拟机 JVM(Java Virtual Machine)是一个抽象机器。之所以称为虚拟机,是因为它在物理上并不存在。它是一个规范,它提供了一个可以在其中执行 Java 字节码的运行时环境。它还可以运行那些用其他语言编写并编译为 Java 字节码的程序…

c++详解之右值引用

右值引用: 右值引用是C11引入的一个新特性,它允许我们显式地将一个表达式标记为右值,从而可以使用移动语义进行优化。 在C中,每个表达式都是要么是左值,要么是右值。左值是指可以取地址的表达式,例如变量…

linux 系统下gcc

linux c gcc gcc编译可以执行4步骤:预处理、编译、汇编、链接 预处理 gcc -E hello.c----->hello.i 展开宏、头文件,替换条件编译,删除注释、空行、空白 编译 gcc -S hello.i------>hello.s 检查语法规范 汇编 gcc -c hello.…

网络安全行业就职岗位有哪些?

网络安全作为目前最火的行业之一,它的细分方向很多。下面介绍一下网络安全主要的方向岗位有哪些,以及职责是什么? 一、安全规划与设计方向 岗位名称:系统安全需求分析师。 岗位职责:负责对目标对象需要达到的安全目标…

DIN11 FVI频率脉冲信号转电压电流信号隔离转换模块变换器

主要特性 将单位脉冲信号转换成直流电压或电流信号。 精度等级:0.1 级、0.2 级、0.5 级。产品出厂前已检验校正,用户可以直接使用。 国际标准信号输入: 0-5KHz/0-10KHz/1-5KHz等 0-5V/0-10V/1-5V 等电压信号,0-10mA/0-20mA/4-20mA 等电流信号。 …

新港转债,百洋转债上市价格预测

新港转债 基本信息 转债名称:新港转债,评级:AA-,发行规模:3.69135亿元。 正股名称:新中港,今日收盘价:8.67元,转股价格:9.18元。 当前转股价值 转债面值 / 转…

Java设计模式-代理模式

简介 代理模式是一种结构型设计模式,它可以让我们通过一个代理对象来访问一个真实的目标对象,从而实现对目标对象的功能扩展或保护。代理模式的主要角色有三个: 抽象主题(Subject):定义了真实主题和代理主…

Prompt 技巧指南-让 ChatGPT 回答准确十倍!

出品人:Towhee 技术团队 作者:张晨 随着 ChatGPT 等大型语言模型 (LLM)的兴起,人们慢慢发现,怎么样向 LLM 提问、以什么技巧提问,是获得更加准确的回答的关键,也由此产生了提示工程这个全新的领域。 提示工…

JavaScript实现输入班级人数和成绩后,输出总成绩、平均成绩、最高分、最低分的代码

以下为实现输入班级人数和成绩输出总成绩、平均成绩、最高分、最低分的代码和运行截图 目录 前言 一、实现输入班级人数和成绩,输出总成绩、平均成绩、最高分、最低分的代码 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有…