Typescript 您如何在运行命令时为每种可能的颜色(1600万种)获取一组图像以显示一个?

Typescript 您如何在运行命令时为每种可能的颜色(1600万种)获取一组图像以显示一个?,typescript,discord.js,Typescript,Discord.js,所以我有一个机器人的颜色命令。用户将为args[0]发送一个十六进制值,而bot当前发送一个MessageEmbed,其中.setColor()为args[0]。这个太小了,我不喜欢。我希望它是那种颜色的完整图像。这是我的彩色代码。ts: import { Message, MessageEmbed } from "discord.js"; export const name = "colour"; export const aliases = [ &q

所以我有一个机器人的颜色命令。用户将为args[0]发送一个十六进制值,而bot当前发送一个MessageEmbed,其中.setColor()为args[0]。这个太小了,我不喜欢。我希望它是那种颜色的完整图像。这是我的彩色代码。ts:

import { Message, MessageEmbed } from "discord.js";

export const name = "colour";
export const aliases = [ "color" ];
export function execute(message: Message, args: string[]) {
  const embed = new MessageEmbed();
  try {
    embed.setColor(args[0].toUpperCase());
  } catch {
    return message.channel.send("Invalid color!");
  }


  message.channel.send(embed);
}

我想删除嵌入,而不是发送一个URL到一个网站与一堆彩色图像。有人知道任何站点/没有站点我怎么能做到这一点吗?

我们可以使用

这里有一个函数,它接受您的颜色以及宽度和高度,并返回一个纯色HTML画布元素。我们利用颜色填充图像

const createColorImage = (hex: string, width: number, height: number): HTMLCanvasElement => {
  const canvas = document.createElement('canvas');
  canvas.width = width;
  canvas.height = height;
  const ctx = canvas.getContext('2d');
  if (ctx) {
    ctx.fillStyle = hex;
    ctx.fillRect(0, 0, width, height);
  }
  return canvas;
}
我不确定发布到discord API需要什么格式,但canvas有许多方法,包括和,您可以使用这些方法来转换它

编辑:

我不确定discord是否接受数据URL,但请尝试以下方法:

const attachColorImage = (message: Message, hex: string, width: number, height: number) => {
  const embed = new MessageEmbed({
    image: {
      url: createColorImage(hex, width, height).toDataURL(),
      width,
      height
    }
  })
  message.channel.send(embed);
}

另外,请不要从typescript更改它,此代码是直接用typescript编写的,而不是JavaScript。我不确定我是否100%理解--是否要创建纯色图像?与
canvas
类似吗?我可以写下来作为回答。@Lindapaste是的,这就是我想要的
const attachColorImage = (message: Message, hex: string, width: number, height: number) => {
  const embed = new MessageEmbed({
    image: {
      url: createColorImage(hex, width, height).toDataURL(),
      width,
      height
    }
  })
  message.channel.send(embed);
}