2

好的,我有一个 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 程序员,所以我不经常以这种方式处理颜色。

4

1 回答 1

1

有几种颜色距离/差异方法

对于您的应用程序(因为您不需要很高的精度),您可以使用欧几里德距离(或颜色度量空间中的另一个规范),如果此距离低于阈值,您将放弃颜色。

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));
}
于 2013-01-09T15:07:21.917 回答