We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
在最近的需求中,设计师给了我两个 apng 格式的动图,要求是在同样的位置,第一个动图播放1遍,第二个动图循环播放,中间要自然衔接和过渡。
apng 格式的动图是我第一次使用到的,我对它的了解仅仅局限于“会动的png图片”。后来几经搜索,总算是把 apng 的一些知识点给补全了。由于网上关于 apng 的资料非常多,因此就不在这里对 apng 进行过多的介绍了。
浏览器默认没有提供 api 让我们去操纵 apng,所以我们无法直接监听 apng 的播放事件,更无法控制它的播放动作。怎么办呢?还好有万能的 npm,直接搜索 apng 就出现了一个名为 apng-js 的库,它可以满足我们的需求。
apng-js 写得很简洁,其核心原理是按照 apng 的规范解析 apng 图片的数据,然后把它们绘制到 canvas 上。与此同时,它还提供了 api 让我们去控制 apng 图片的播放、暂停、复位,更能监听这些图片播放中产生的事件,使得我们拥有了对 apng 的完全控制权。废话不多说,直接上例子让我们看看 apng-js 是如何完成我们的需求的。
<canvas>
<canvas id="canvas"></canvas>
// js file import parseAPNG from "https://cdn.skypack.dev/[email protected]"; const img1Src = 'https://official-account-web-1251316161.cos.ap-guangzhou.myqcloud.com/mqq-static/open-platform-animate-1-new.png' const img2Src = 'https://official-account-web-1251316161.cos.ap-guangzhou.myqcloud.com/mqq-static/open-platform-animate-2-new.png' const canvas = document.querySelector('#canvas') canvas.width = 640; canvas.height = 540; canvas.style = 'zoom: 0.75'; const ctx = canvas.getContext('2d');
ArrayBuffer
// js file // 获取图片并转化成 ArrayBuffer function getImgBuffer(url) { return new Promise(async resolve => { const blob = await fetch(url).then(res => res.blob()); const reader = new FileReader(); reader.readAsArrayBuffer(blob); reader.onload = () => { resolve(reader.result); }; }); }
createApngPlayer()
async function createApngPlayer(url, ctx, options = {}) { const imgBuffer = await getImgBuffer(url); const apng = parseAPNG(imgBuffer); Object.keys(options).forEach(key => { apng[key] = options[key]; }); const player = await apng.getPlayer(ctx); return player; }
;(async () => { const player1 = await createApngPlayer(img1Src, ctx, { numPlays: 1 }); // 设置图1的 numPlays 为1,让其只播放一次 const player2 = await createApngPlayer(img2Src, ctx); player1.play(); // 图1播放 player1.on('end', () => { // 监听图1的播放,当其播放完毕时,马上开始图2的播放 player2.play(); }); })()
实现效果可以看我在 Codepen 的例子: https://codepen.io/jrainlau/pen/abWmaNK
大功告成!
The text was updated successfully, but these errors were encountered:
No branches or pull requests
在最近的需求中,设计师给了我两个 apng 格式的动图,要求是在同样的位置,第一个动图播放1遍,第二个动图循环播放,中间要自然衔接和过渡。

apng 格式的动图是我第一次使用到的,我对它的了解仅仅局限于“会动的png图片”。后来几经搜索,总算是把 apng 的一些知识点给补全了。由于网上关于 apng 的资料非常多,因此就不在这里对 apng 进行过多的介绍了。
浏览器默认没有提供 api 让我们去操纵 apng,所以我们无法直接监听 apng 的播放事件,更无法控制它的播放动作。怎么办呢?还好有万能的 npm,直接搜索 apng 就出现了一个名为 apng-js 的库,它可以满足我们的需求。
apng-js 写得很简洁,其核心原理是按照 apng 的规范解析 apng 图片的数据,然后把它们绘制到 canvas 上。与此同时,它还提供了 api 让我们去控制 apng 图片的播放、暂停、复位,更能监听这些图片播放中产生的事件,使得我们拥有了对 apng 的完全控制权。废话不多说,直接上例子让我们看看 apng-js 是如何完成我们的需求的。
<canvas>
元素准备好,然后引入 apng-js 库,初始化 canvas 的尺寸和图片资源。ArrayBuffer
形式的数据,因此我们需要自行写函数来把 apng 转化成 ArrayBuffer。createApngPlayer()
的公用函数,输出 apng-js 的 player 实例,方便我们的后续使用。实现效果可以看我在 Codepen 的例子:
https://codepen.io/jrainlau/pen/abWmaNK
大功告成!
The text was updated successfully, but these errors were encountered: