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

news/2024/7/8 3:39:43

当前做项目有一个需求是将多张图片生成一个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://lihuaxi.xjx100.cn/news/1099124.html

相关文章

DMU 以及后期flashback 回退

DMU作为数据库字符集的转换工具,在转换后可能需要回退。这时可以结合oralce的flash back database Step 1: Enable Archiving( Ignore this if your database is already in archive log mode and archive log is enabled): CONN / AS SYSDBA ALTER SYSTEM SET log…

GPT到底要砸掉多少打工人的饭碗?

今天我们继续来聊GPT 对工作的冲击问题 首先分享一个我最近在网上看到的 利用AI的暗黑方法 就是接下来 在很多对AI无感的那些公司里面 尤其是非科技公司 未来一两年 其实可能是打工人混日子的黄金时期 因为懂AI的下属 用1/10的时间 就可以把工作做得比原来更好 但是不懂AI的老板…

国家信息安全水平考试中NISP三级(专项)网络安全证书介绍

国家信息安全水平考试中NISP三级(专项)网络安全证书介绍 ​1、什么是NISP? 国家信息安全水平考试(National Information Security Test Program,简称NISP),是由中国信息安全测评中心实施培养国家网络空间…

ES的概述

一、ECMASript 相关介绍 1.1什么是 ECMA ECMA ( European Computer Manufacturers Association )中文名称为欧洲计算机制 造商协会,这个组织的目标是评估、开发和认可电信和计算机标准。 1994 年后该 组织改名为 Ecma 国际。 1.2.什么…

怎样恢复u盘里删除的文件

当我们需要存储数据文件时,会根据实际需要选择一些云盘、U盘等存储工具,来完成存储工作。但有使用难免会有意外情况的发生,比如说在我们使用u盘时,会因为这样或那样的原因丢失或删除了文件。遇到这种情况,要怎样恢复u盘…

HTML5字体集合的实践经验

随着互联网的发展,网站已成为人们获取信息和交流的重要平台。而一个好的网站,不仅需要有美观的界面,还需要有良好的用户体验。其中,字体是影响用户体验的一个重要因素。下面就让我们来看看HTML字体集合的相关内容。 HTML字体集合是…

{.....},正则表达式将{}和{}中的内容全部替换为1

解决办法:replaceAll("\\{.*?\\}", "1") 当在Java字符串中使用正则表达式时,需要注意转义字符的使用。因为在Java中某些字符本身就有特殊含义,例如 \、{、} 等等,如果直接使用这些字符来进行正则表达式匹配…

yolov5读取单通道图像会怎样?

通过上图打印可知输入是固定3通道,那么意味着在读取图像中会对图像进行处理。 opencv在默认情况下会读取3个通道的图像,如果是灰度图会将图层复制三次(BGR缺省,BGR),因此读出来的图片是三通道。