好的,我有一个Qt GUI应用程序,我决定随机生成调色板(允许我区分基于数据的唯一ID显示的数据)。
我使用的算法如下:
void Palette::generatePalette(quint32 seed, bool dark) {
sfmt_t sfmt;
sfmt_init_gen_rand(&sfmt, seed);
quint32 i;
qreal hue;
QColor col;
qreal lightness = 0.75;
qreal saturation = 0.6;
if (dark) {
lightness = 0.5;
saturation = 0.8;
}
for (i = 0; i < numberOfColors; i++) {
hue = sfmt_genrand_res53(&sfmt);
hue += 0.618033988749895;
hue = fmod(hue, 1.0);
col = QColor::fromHslF(hue, saturation, lightness);
palette.append(col);
}
}
这在很大程度上给了我很好的柔和色彩,这些色彩在灰色背景下非常明显。然而,偶尔会出现一种黄色,不容易与背景区分开来。
我想知道的是,是否可以以编程方式将背景颜色与生成的颜色进行比较,如果它太难以区分,则丢弃并重新生成颜色。
我在谷歌上寻找答案,但我找不到答案。我通常也不是GUI程序员,所以我不经常以这种方式使用颜色。
答案 0 :(得分:1)
有几个color distance/difference methods。
对于您的应用程序(因为您不需要很高的准确性),您可以使用Euclidean distance(或颜色度量标准空间中的其他标准),如果此距离低于阈值,您将删除颜色。
double colorRGBEuclideanDistance(const QColor& c1, const QColor& c2)
{
return sqrt(pow(c1.red()-c2.red(), 2) +
pow(c1.green()-c2.green(), 2) +
pow(c1.blue()-c2.blue(), 2));
}