Несколько лет назад Рэндалл Монро (из XKCD) сделал large online survey of English-speakers, результатом чего стал list of over 900 colour names. Вы можете легко использовать эти данные в качестве основы функции присвоения цвета, которая преобразует триплет RGB в имя ближайшего цвета. Это то, что простая реализация будет выглядеть в C, например:
#include <stdio.h>
#define squared(X) ((X) * (X))
typedef struct {
char *name;
unsigned char r, g, b;
} color_name;
/* Source: http://xkcd.com/color/rgb.txt */
/* License: http://creativecommons.org/publicdomain/zero/1.0/ */
static const color_name xkcd_colors[] = {
{"cloudy blue",0xac,0xc2,0xd9}, {"dark pastel green",0x56,0xae,0x57},
{"dust",0xb2,0x99,0x6e}, {"electric lime",0xa8,0xff,0x04},
:
(et cetera)
:
{"blue",0x03,0x43,0xdf}, {"green",0x15,0xb0,0x1a},
{"purple",0x7e,0x1e,0x9c}
};
int main(int argc, char *argv[]) {
int red, green, blue, d2, mind2, i, result;
if (argc != 2 ||sscanf(argv[1],"%02x%02x%02x",&red,&green,&blue) != 3)
return !puts("Provide 6 hex chars as command line argument.");
mind2 = 256 * 256 * 3;
for (i=0; i<sizeof(xkcd_colors)/sizeof(color_name); i++) {
d2 = squared(red - xkcd_colors[i].r) + /* Calculate squared */
squared(green - xkcd_colors[i].g) + /* distance from each */
squared(blue - xkcd_colors[i].b); /* color in list. */
if (d2 < mind2) {
mind2 = d2; /* Find the minimum distance and */
result = i; /* store the index of this color */
}
}
printf("That color is called \"%s\"\n",xkcd_colors[result].name);
return 0;
}
ПРИМЕЧАНИЕ: Вы можете основывать свою функции на разный набор данных, если вы не хотите, чтобы он дал результаты например «baby shit brown» (# ad900d) или «puke» (# a5a502), но принцип тот же.
Цветное имя? Это немного абсурдно в наше время, у кого есть время, чтобы найти 16,7 миллиона разных имен? –
да, но это мои требования к проекту – user4440416
sth like: http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.birt.doc.isv%2Fmodel%2Fapi%2Forg%2Feclipse%2Fbirt % 2Freport% 2Fmodel% 2Fapi% 2Futil% 2FColorUtil.html ?? – mico