当前位置:首页 > 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分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js实现 拖动

js实现 拖动

实现拖动的步骤 HTML 结构 创建一个可拖动的元素和一个放置区域: <div id="draggable" draggable="true">拖动我</div> <d…

js 实现全屏

js 实现全屏

使用 requestFullscreen 方法 通过调用元素的 requestFullscreen 方法可以实现全屏。该方法兼容现代浏览器,但不同浏览器可能需要前缀。 const element =…

js实现左右滑动

js实现左右滑动

实现左右滑动的 JavaScript 方法 监听触摸事件 通过 touchstart、touchmove 和 touchend 事件来检测用户的手势操作。记录触摸的起始位置和移动距离,判断滑动方向。…

js 实现截图

js 实现截图

使用html2canvas库实现截图 html2canvas是一个流行的JavaScript库,可将HTML元素转换为Canvas,进而导出为图片。 安装库: npm instal…