当前位置:首页 > JavaScript

js 实现gif

2026-04-06 20:36:42JavaScript

使用 Canvas 生成 GIF

通过 canvas 绘制帧并利用 gif.jsomggif 库编码为 GIF 格式。

js 实现gif

// 安装 gif.js
// npm install gif.js

import GIF from 'gif.js';

const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
const gif = new GIF({
  workers: 2,
  quality: 10,
  width: canvas.width,
  height: canvas.height
});

// 添加帧(示例:绘制矩形动画)
for (let i = 0; i < 10; i++) {
  ctx.fillStyle = `rgb(${i * 25}, 0, 0)`;
  ctx.fillRect(0, 0, 100, 100);
  gif.addFrame(canvas, { delay: 100, copy: true });
}

// 生成 GIF
gif.on('finished', (blob) => {
  const url = URL.createObjectURL(blob);
  const img = document.createElement('img');
  img.src = url;
  document.body.appendChild(img);
});
gif.render();

使用 FFmpeg.js 转换视频为 GIF

通过 ffmpeg.js 将视频或图像序列转为 GIF(适用于复杂场景)。

js 实现gif

// 安装 FFmpeg.js
// npm install @ffmpeg/ffmpeg @ffmpeg/core

import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg';

const ffmpeg = createFFmpeg({ log: true });
await ffmpeg.load();

// 假设已有视频文件
const videoData = await fetchFile('input.mp4');
ffmpeg.FS('writeFile', 'input.mp4', videoData);

// 转换为 GIF
await ffmpeg.run('-i', 'input.mp4', '-vf', 'fps=10', 'output.gif');
const gifData = ffmpeg.FS('readFile', 'output.gif');
const gifUrl = URL.createObjectURL(new Blob([gifData.buffer], { type: 'image/gif' }));
document.getElementById('gif').src = gifUrl;

使用纯前端库 gifencoder

通过 gifencoder 直接生成 GIF,适合动态绘图场景。

// 安装 gifencoder
// npm install gifencoder

const { createCanvas } = require('canvas');
const GIFEncoder = require('gifencoder');

const encoder = new GIFEncoder(200, 200);
encoder.createReadStream().pipe(fs.createWriteStream('output.gif'));

encoder.start();
encoder.setRepeat(0); // 0 为无限循环
encoder.setDelay(100); // 帧延迟(毫秒)

const canvas = createCanvas(200, 200);
const ctx = canvas.getContext('2d');

for (let i = 0; i < 10; i++) {
  ctx.fillStyle = `rgb(${i * 25}, 0, 0)`;
  ctx.fillRect(0, 0, 200, 200);
  encoder.addFrame(ctx);
}

encoder.finish();

注意事项

  • 性能问题:GIF 编码较耗时,建议在 Web Worker 中处理。
  • 质量与体积:调整 qualityfps 以平衡清晰度和文件大小。
  • 兼容性gif.jsffmpeg.js 需现代浏览器支持。

以上方法可根据需求选择,canvas + gif.js 适合简单动画,ffmpeg.js 适合复杂媒体转换。

标签: jsgif
分享给朋友:

相关文章

js 实现vue

js 实现vue

实现 Vue 的核心功能 在 JavaScript 中实现 Vue 的核心功能需要模拟数据绑定、虚拟 DOM 和响应式系统。以下是一个简化版的实现思路: 响应式系统 通过 Object.define…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码 funct…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数:…