我使用discord.js创建了一个简单的程序,我想要的是将静止图像与包含动画帧的图像组合起来,然后机器人将在一张图像中发送动画图像的结果和静止图像的背景。
const Discord = require('discord.js');
const sharp = require('sharp');
const client = new Discord.Client({ intents: ["GUILDS", "GUILD_MESSAGES"] });
client.on('messageCreate', async message => {
if (message.content === '!merge') {
const background = await sharp('logo.png').resize(288, 288);
const overlay = await sharp('banana.gif').resize(288, 288);
const result = await background.composite([{ input: await overlay.toBuffer(), gravity: 'center' }]).toBuffer();
message.channel.send({ files: [result] });
}
});
client.login('your-token');
但结果并不成功,它发送的是静态图像,没有GIF格式的动画帧。
我试图寻找一个包裹,但没有找到任何东西。
我们希望有人能帮助我们解决这个问题,谢谢。
为了创建动画图像,您必须告诉 Sharp 对合成结果进行动画处理。
根据文档,复合的默认行为是有一个默认值animated = false。所以你要做的就是告诉它哪些图像是动画的。
根据这个SO答案,我们可以通过创建背景图像卷并合成来合成图像。
然而,当我这样做并尝试让不和谐机器人发送直接缓冲区数据时,结果是它仍然是静态图像......因此解决方法是将图像写入文件发送文件然后清理文件发送后。
您对该答案的代码改编如下:
从您的代码看来,您正在使用已弃用的 Discord 版本。对于使用 Discord v14 及更高版本的用户,代码如下所示:
在此示例中,我使用当前时间来创建“唯一”文件名。请使用适当的包使文件真正独一无二,并确保采用正确的错误处理。此代码用于演示目的(作为起点)。