如何在 Canvas 上播放 GIF 动画
如何在 Canvas 上显示 GIF 动画?
无法将 GIF 图像直接插入 Canvas。但是,可以使用外部库解析 GIF,然后将其作为 Konva.Image 图形绘制到图层中。
此示例使用 gifler 解析和绘制 GIF。也可以 使用其他库。
- Vanilla
- React
- Vue
import Konva from 'konva';
// Load gifler library
const script = document.createElement('script');
script.src = 'https://unpkg.com/[email protected]/gifler.min.js';
document.head.appendChild(script);
const stage = new Konva.Stage({
container: 'container',
width: window.innerWidth,
height: window.innerHeight,
});
const layer = new Konva.Layer();
stage.add(layer);
const canvas = document.createElement('canvas');
// use external library to parse and draw gif animation
function onDrawFrame(ctx, frame) {
// update canvas size
canvas.width = frame.width;
canvas.height = frame.height;
// update canvas that we are using for Konva.Image
ctx.drawImage(frame.buffer, 0, 0);
// redraw the layer
layer.draw();
}
script.onload = () => {
gifler('https://konvajs.org/assets/yoda.gif').frames(canvas, onDrawFrame);
};
// draw resulted canvas into the stage as Konva.Image
const image = new Konva.Image({
image: canvas,
});
layer.add(image);
import React from 'react';
import { Stage, Layer, Image } from 'react-konva';
const GifImage = () => {
const imageRef = React.useRef(null);
const canvasRef = React.useRef(document.createElement('canvas'));
React.useEffect(() => {
// Load gifler library
const script = document.createElement('script');
script.src = 'https://unpkg.com/[email protected]/gifler.min.js';
script.onload = () => {
// use external library to parse and draw gif animation
function onDrawFrame(ctx, frame) {
// update canvas size
canvasRef.current.width = frame.width;
canvasRef.current.height = frame.height;
// update canvas that we are using for Konva.Image
ctx.drawImage(frame.buffer, 0, 0);
// update Konva.Image
imageRef.current?.getLayer()?.batchDraw();
}
gifler('https://konvajs.org/assets/yoda.gif').frames(canvasRef.current, onDrawFrame);
};
document.head.appendChild(script);
return () => script.remove();
}, []);
return (
<Image
ref={imageRef}
image={canvasRef.current}
/>
);
};
const App = () => {
return (
<Stage width={window.innerWidth} height={window.innerHeight}>
<Layer>
<GifImage />
</Layer>
</Stage>
);
};
export default App;
<template>
<v-stage :config="stageConfig">
<v-layer>
<v-image
:config="{ image: canvas }"
ref="imageRef"
/>
</v-layer>
</v-stage>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
const canvas = document.createElement('canvas');
const imageRef = ref(null);
const stageConfig = {
width: window.innerWidth,
height: window.innerHeight
};
onMounted(() => {
// Load gifler library
const script = document.createElement('script');
script.src = 'https://unpkg.com/[email protected]/gifler.min.js';
script.onload = () => {
// use external library to parse and draw gif animation
function onDrawFrame(ctx, frame) {
// update canvas size
canvas.width = frame.width;
canvas.height = frame.height;
// update canvas that we are using for Konva.Image
ctx.drawImage(frame.buffer, 0, 0);
// update Konva.Image
imageRef.value.getNode().getLayer().batchDraw();
}
gifler('https://konvajs.org/assets/yoda.gif').frames(canvas, onDrawFrame);
};
document.head.appendChild(script);
return () => script.remove();
});
</script>
操作说明:此示例展示如何使用 gifler 库在 Canvas 上渲染 GIF 动画。示例解析 GIF 并将每一帧绘制到一个 Canvas 上,然后将该 Canvas 用作 Konva.Image 图形的图像源。