QColor::lightnessF()のよくある落とし穴と解決策 – Qt開発者必見

2025-05-26

QColor::lightnessF() は、Qt の QColor クラスが提供するメンバー関数の一つで、色のHLS (Hue, Saturation, Lightness) モデルにおける「明度(lightness)」の値を浮動小数点数(float または qreal)で取得します。

HLS モデルとは

HLS モデルは、色を「色相(Hue)」「彩度(Saturation)」「明度(Lightness)」の3つの要素で表現する色空間です。

  • Lightness (明度): 色の明るさを表します。黒から色、そして色から白へと変化します。0は黒、1.0は白に近づきます。
  • Saturation (彩度): 色の鮮やかさを表します。彩度が高いほど色は鮮やかになり、低いほど灰色に近づきます。
  • Hue (色相): 色の種類(赤、青、緑など)を表します。通常は0〜359度の角度で表現され、赤が0度、緑が120度、青が240度などとなります。

lightnessF() の特徴

  • 浮動小数点精度: QColor クラスには、整数値で色のコンポーネントを扱う関数(例: lightness())と、浮動小数点数で扱う関数(例: lightnessF())があります。lightnessF() は浮動小数点数を使用するため、より細かい明度の表現が可能です。
    • 整数値の lightness() は通常 0 から 255 の範囲の値を返します。
  • 値の範囲: 0.0 から 1.0 の範囲で明度を返します。
    • 0.0 は完全に黒を示します。
    • 1.0 は完全に白を示します。
    • 中間の値は、その色の明るさに応じた明度を示します。
  • 戻り値の型: float (またはQtでは qreal という型が使われることもあります。これは通常 double に解決されます)。

使用例

ある QColor オブジェクトから明度の値を取得するには、以下のようにします。

#include <QColor>
#include <QDebug>

int main() {
    QColor color(128, 0, 128); // 紫色 (RGB)

    // 浮動小数点数で明度を取得
    float lightness = color.lightnessF();
    qDebug() << "Lightness (float):" << lightness;

    // 整数値で明度を取得(比較のため)
    int lightnessInt = color.lightness();
    qDebug() << "Lightness (int):" << lightnessInt;

    QColor black(0, 0, 0);
    qDebug() << "Black lightnessF():" << black.lightnessF(); // ほぼ 0.0 を返す

    QColor white(255, 255, 255);
    qDebug() << "White lightnessF():" << white.lightnessF(); // ほぼ 1.0 を返す

    return 0;
}

このコードを実行すると、次のような出力が得られるはずです(正確な値はQtのバージョンや内部実装によってわずかに異なる場合がありますが、範囲は守られます)。

Lightness (float): 0.25098
Lightness (int): 64
Black lightnessF(): 0
White lightnessF(): 1


無効な QColor オブジェクトからの取得

エラー/問題

QColor オブジェクトが isValid()false を返すような無効な状態である場合、lightnessF() の結果は未定義(undefined)となります。これは通常、予期しない数値(NaN、非常に大きな/小さな数、または全く無関係な値)を返す原因となります。

具体例

QColor invalidColor; // デフォルトコンストラクタは無効な色を作成
qDebug() << invalidColor.isValid(); // false
float lightness = invalidColor.lightnessF();
qDebug() << lightness; // 予測不能な値が出力される可能性

トラブルシューティング

lightnessF() を呼び出す前に、常に QColor::isValid() で色の有効性を確認することが重要です。

QColor myColor(100, 150, 200); // 有効な色
if (myColor.isValid()) {
    float lightness = myColor.lightnessF();
    qDebug() << "Lightness:" << lightness;
} else {
    qDebug() << "Invalid color!";
}

RGB値とHLS値の変換による丸め誤差

QColor は内部的に色をRGB値で保持しており、lightnessF() はHLSモデルに変換して値を計算します。この変換プロセスには浮動小数点演算が伴うため、ごくわずかな丸め誤差が生じる可能性があります。これは通常、目に見える問題にはなりませんが、厳密な数値比較を行う場合に考慮すべき点です。

例えば、setHslF(h, s, l) で設定した l の値と、後で lightnessF() で取得した値が、ごくわずかに異なる可能性があります。

QColor color;
color.setHslF(0.5, 0.5, 0.5); // H, S, L を設定
float retrievedLightness = color.lightnessF();
qDebug() << "Set lightness:" << 0.5;
qDebug() << "Retrieved lightness:" << retrievedLightness;
// 0.5 と retrievedLightness が完全に一致しない場合がある

浮動小数点数の比較には、厳密な == 演算子を使用せず、許容範囲(epsilon)を設けるべきです。

const float EPSILON = 0.0001f;
if (qAbs(retrievedLightness - 0.5f) < EPSILON) {
    qDebug() << "Lightness is approximately 0.5";
}

明度の解釈の誤解

lightnessF() はHLSモデルの明度を返します。これはHSV (Hue, Saturation, Value) モデルの「Value (V)」や、知覚的な明るさ(luminance)とは異なる概念です。特に、HSLのLightnessは0.0が純粋な黒、1.0が純粋な白を示しますが、中間の値は色の彩度にも影響されます。

例えば、純粋な赤(RGB: 255, 0, 0)のLightnessは 0.5 に近い値になりますが、これは「中間の明るさ」という意味合いであり、純粋な灰色(RGB: 128, 128, 128)の明度とは異なる知覚的明るさを持つ場合があります。

RGB (255, 0, 0) の lightnessF() は約 0.5 を返します。 RGB (128, 128, 128) の lightnessF() も約 0.5 を返します。 しかし、これらの色は知覚的には異なる明るさを持つ場合があります。

目的とする「明るさ」の定義に応じて、適切な色空間のコンポーネントを使用する必要があります。

  • 知覚的明るさ(luminance):人間の目の知覚に近い明るさを扱いたい場合は、RGB値から輝度を計算する標準的な式(例: 0.2126×R+0.7152×G+0.0722×B)を使用する方が適切です。Qtには直接輝度を計算する関数はありませんが、自分で計算することは可能です。
  • HSVのValue (Value/Brightness):色の鮮やかさを保ちつつ、明るさを調整したい場合にHLSのLightnessよりも適している場合があります。QColor::valueF() を使用します。
  • HLSの明度(lightness):色を黒から白までグラデーションさせたい場合などに適しています。
// 知覚的な明るさの計算例 (sRGB)
float r_linear = qPow(color.redF(), 2.2);
float g_linear = qPow(color.greenF(), 2.2);
float b_linear = qPow(color.blueF(), 2.2);
float luminance = 0.2126f * r_linear + 0.7152f * g_linear + 0.0722f * b_linear;
qDebug() << "Luminance:" << luminance; // 0.0 から 1.0 の範囲

QColor オブジェクトがRGB以外の色空間(CMYKなど)で初期化された場合、lightnessF() を呼び出す前に内部的にHLSに変換されます。この変換が、元の意図と異なる結果をもたらす可能性があります。

特に色空間変換を意識せずに QColor を使用している場合、QColor::spec() を使って現在の色空間を確認することができます。

QColor cmykColor;
cmykColor.setCmykF(0.0, 0.5, 0.5, 0.0); // シアン100%
qDebug() << "Color spec:" << cmykColor.spec(); // QColor::Cmyk

float lightness = cmykColor.lightnessF(); // HLSに変換されて計算される
qDebug() << "Lightness (from CMYK):" << lightness;


例1: 基本的な明度の取得と表示

この例では、いくつかの異なる色を作成し、それぞれの lightnessF() の値をコンソールに出力します。

#include <QCoreApplication>
#include <QColor>
#include <QDebug> // qCout や qDebug() を使用するために必要

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 1. 赤色のQColorオブジェクトを作成
    QColor redColor(255, 0, 0);
    // 2. 緑色のQColorオブジェクトを作成
    QColor greenColor(0, 255, 0);
    // 3. 青色のQColorオブジェクトを作成
    QColor blueColor(0, 0, 255);
    // 4. グレー色のQColorオブジェクトを作成 (中間的な明度)
    QColor grayColor(128, 128, 128);
    // 5. 黒色のQColorオブジェクトを作成 (明度 0.0 に近い)
    QColor blackColor(0, 0, 0);
    // 6. 白色のQColorオブジェクトを作成 (明度 1.0 に近い)
    QColor whiteColor(255, 255, 255);
    // 7. 透明な色 (無効な色、lightnessF() は未定義)
    QColor invalidColor; // デフォルトコンストラクタは無効な色を作成

    qDebug() << "--- 色の明度 (lightnessF()) を取得する ---";

    // 各色のlightnessF()を取得して出力
    // RGBの原色(赤、緑、青)はHLSモデルではL=0.5になる傾向があります。
    // 黒はL=0.0、白はL=1.0になります。

    qDebug() << "Red Color (RGB: 255, 0, 0) lightnessF():" << redColor.lightnessF();
    qDebug() << "Green Color (RGB: 0, 255, 0) lightnessF():" << greenColor.lightnessF();
    qDebug() << "Blue Color (RGB: 0, 0, 255) lightnessF():" << blueColor.lightnessF();
    qDebug() << "Gray Color (RGB: 128, 128, 128) lightnessF():" << grayColor.lightnessF();
    qDebug() << "Black Color (RGB: 0, 0, 0) lightnessF():" << blackColor.lightnessF();
    qDebug() << "White Color (RGB: 255, 255, 255) lightnessF():" << whiteColor.lightnessF();

    // 無効な色のlightnessF()を呼び出す前にisValid()でチェック
    qDebug() << "\n--- 無効な色のチェック ---";
    if (invalidColor.isValid()) {
        qDebug() << "Invalid Color lightnessF():" << invalidColor.lightnessF();
    } else {
        qDebug() << "Invalid Color: この色は有効ではありません。lightnessF()は呼び出しません。";
    }

    return a.exec();
}

実行結果の例

--- 色の明度 (lightnessF()) を取得する ---
Red Color (RGB: 255, 0, 0) lightnessF(): 0.5
Green Color (RGB: 0, 255, 0) lightnessF(): 0.5
Blue Color (RGB: 0, 0, 255) lightnessF(): 0.5
Gray Color (RGB: 128, 128, 128) lightnessF(): 0.501961
Black Color (RGB: 0, 0, 0) lightnessF(): 0
White Color (RGB: 255, 255, 255) lightnessF(): 1
--- 無効な色のチェック ---
Invalid Color: この色は有効ではありません。lightnessF()は呼び出しません。

例2: 色の明度に基づいてUI要素を調整する

この例では、GUIアプリケーション(Qt Widgets)において、背景色の明度に基づいてテキストの色を黒または白に自動的に切り替えるシンプルなウィジェットを示します。これにより、常にテキストが読みやすくなります。

main.cpp

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QVBoxLayout>
#include <QPushButton>
#include <QColor>
#include <QRandomGenerator> // 乱数生成用

class ColorChangerWidget : public QWidget
{
    Q_OBJECT // シグナルとスロットを使用するために必要

public:
    ColorChangerWidget(QWidget *parent = nullptr) : QWidget(parent)
    {
        // レイアウトの設定
        QVBoxLayout *layout = new QVBoxLayout(this);

        // ラベルの作成
        m_label = new QLabel("背景色に合わせてテキスト色が変わります", this);
        m_label->setAlignment(Qt::AlignCenter); // 中央揃え
        m_label->setFont(QFont("Arial", 24, QFont::Bold)); // フォント設定
        layout->addWidget(m_label);

        // ボタンの作成
        QPushButton *changeColorButton = new QPushButton("背景色を変更", this);
        connect(changeColorButton, &QPushButton::clicked, this, &ColorChangerWidget::changeBackgroundColor);
        layout->addWidget(changeColorButton);

        // ウィジェットの初期背景色を設定
        changeBackgroundColor();
    }

private slots:
    void changeBackgroundColor()
    {
        // ランダムな色を生成
        int r = QRandomGenerator::global()->bounded(256);
        int g = QRandomGenerator::global()->bounded(256);
        int b = QRandomGenerator::global()->bounded(256);
        QColor newColor(r, g, b);

        // 背景色を設定
        QString styleSheet = QString("background-color: rgb(%1, %2, %3);")
                                 .arg(newColor.red())
                                 .arg(newColor.green())
                                 .arg(newColor.blue());
        setStyleSheet(styleSheet);

        // lightnessF() を使って明度を取得
        float lightness = newColor.lightnessF();

        // 明度に基づいてテキスト色を設定
        if (lightness > 0.5) { // 明るい背景色の場合
            m_label->setStyleSheet("color: black;"); // 黒いテキスト
        } else { // 暗い背景色の場合
            m_label->setStyleSheet("color: white;"); // 白いテキスト
        }

        qDebug() << "新しい背景色 (RGB):" << r << g << b << ", lightnessF():" << lightness;
    }

private:
    QLabel *m_label;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    ColorChangerWidget widget;
    widget.setWindowTitle("QColor::lightnessF()の例");
    widget.resize(400, 200);
    widget.show();

    return a.exec();
}

#include "main.moc" // mocファイルを生成するために必要 (QtCreatorなら自動)

説明

  1. ColorChangerWidget クラス: QWidget を継承したカスタムウィジェットです。
  2. m_label: 背景色に合わせてテキストの色が変わる QLabel です。
  3. changeBackgroundColor() スロット:
    • QRandomGenerator::global()->bounded(256) を使用して、ランダムなRGB値を生成し、新しい QColor オブジェクトを作成します。
    • setStyleSheet() を使って、ウィジェットの背景色を新しいランダムな色に設定します。
    • newColor.lightnessF() を呼び出して、生成された色のHLS明度を取得します。
    • lightness の値が 0.5 より大きい(明るい)場合はテキスト色を黒に、それ以外(暗い)の場合はテキスト色を白に設定します。これにより、背景色が何であってもテキストが読みやすくなります。

この例では、lightnessF() がUIのユーザビリティ向上にどのように役立つかを示しています。

この例は、実際の画像処理を行うコードではありませんが、lightnessF() の考え方を画像処理に応用する概念を示します。たとえば、画像の特定ピクセルの明度を分析して、そのピクセルに対する処理を変える場合などです。

#include <QCoreApplication>
#include <QColor>
#include <QImage> // QImage を使うために必要
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug() << "--- 画像処理における明度分析の概念 ---";

    // 概念的なQImageオブジェクトの作成(実際には画像をロードする)
    // QImage image("path/to/your/image.png");
    // if (image.isNull()) {
    //     qDebug() << "画像のロードに失敗しました。";
    //     return 1;
    // }

    // 例として、特定のピクセルの色をシミュレート
    // 実際の画像処理では、image.pixelColor(x, y) を使って各ピクセルの色を取得します。

    QColor pixelColor1(50, 50, 50);   // 暗い灰色
    QColor pixelColor2(200, 200, 200); // 明るい灰色
    QColor pixelColor3(0, 100, 200); // 暗めの青

    // 各ピクセルの明度を取得
    float lightness1 = pixelColor1.lightnessF();
    float lightness2 = pixelColor2.lightnessF();
    float lightness3 = pixelColor3.lightnessF();

    qDebug() << "Pixel Color 1 (RGB: 50, 50, 50) lightnessF():" << lightness1;
    qDebug() << "Pixel Color 2 (RGB: 200, 200, 200) lightnessF():" << lightness2;
    qDebug() << "Pixel Color 3 (RGB: 0, 100, 200) lightnessF():" << lightness3;

    // 明度に基づいて異なる処理を行う例
    if (lightness1 < 0.2) {
        qDebug() << "Pixel 1は非常に暗いので、明るくする補正を適用します。";
    } else if (lightness1 > 0.8) {
        qDebug() << "Pixel 1は非常に明るいので、暗くする補正を適用します。";
    } else {
        qDebug() << "Pixel 1は中程度の明るさです。";
    }

    if (lightness2 < 0.2) {
        qDebug() << "Pixel 2は非常に暗いので、明るくする補正を適用します。";
    } else if (lightness2 > 0.8) {
        qDebug() << "Pixel 2は非常に明るいので、暗くする補正を適用します。";
    } else {
        qDebug() << "Pixel 2は中程度の明るさです。";
    }

    // 実際の画像処理ループの概念:
    // for (int y = 0; y < image.height(); ++y) {
    //     for (int x = 0; x < image.width(); ++x) {
    //         QColor pixel = image.pixelColor(x, y);
    //         float currentLightness = pixel.lightnessF();
    //         // currentLightness に基づいてピクセルを変換したり、分析したりする
    //         // 例: if (currentLightness < threshold) { ... }
    //     }
    // }

    return a.exec();
}

この例では、lightnessF() が画像の各ピクセルの明るさに基づいて条件分岐を行う場合の基本的な考え方を示しています。例えば、画像の暗い部分と明るい部分で異なるフィルタを適用したり、特定の色範囲の明度を分析して画像の特徴を抽出したりする場合に利用できます。



HSVモデルの「Value (V)」または「Brightness」を使用する (QColor::valueF())

HLSモデルのLightnessと混同されがちですが、HSV (Hue, Saturation, Value/Brightness) モデルのValueは、異なる方法で色の明るさを表現します。

  • HSVのValue (V): V=0 は常に黒を示し、V=1 はその色の最大彩度・最大明度を示します。V を下げると、色は黒に近づきますが、色相と彩度の相対的な関係は保たれます。
  • HLSのLightness (L): 色を黒と白の間で補間します。L=0 は黒、L=1 は白です。彩度が高い色は中間の明度でも明るく感じられます。

用途: 色の「純粋な明るさ」を調整したい場合、特に暗い色から明るい色へのグラデーションを作成する際に、HLSのLightnessよりも自然な結果が得られることがあります。

プログラミング例

#include <QCoreApplication>
#include <QColor>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QColor red(255, 0, 0); // 純粋な赤
    QColor darkRed(128, 0, 0); // 暗い赤
    QColor black(0, 0, 0);   // 黒
    QColor white(255, 255, 255); // 白
    QColor gray(128, 128, 128); // 灰色

    qDebug() << "--- HSV Value (Brightness) の取得 ---";

    qDebug() << "Red (RGB: 255, 0, 0)";
    qDebug() << "  lightnessF():" << red.lightnessF(); // 約 0.5
    qDebug() << "  valueF():" << red.valueF();         // 1.0 (最大値)

    qDebug() << "Dark Red (RGB: 128, 0, 0)";
    qDebug() << "  lightnessF():" << darkRed.lightnessF(); // 約 0.25
    qDebug() << "  valueF():" << darkRed.valueF();         // 0.501961 (約 128/255)

    qDebug() << "Black (RGB: 0, 0, 0)";
    qDebug() << "  lightnessF():" << black.lightnessF(); // 0.0
    qDebug() << "  valueF():" << black.valueF();         // 0.0

    qDebug() << "White (RGB: 255, 255, 255)";
    qDebug() << "  lightnessF():" << white.lightnessF(); // 1.0
    qDebug() << "  valueF():" << white.valueF();         // 1.0

    qDebug() << "Gray (RGB: 128, 128, 128)";
    qDebug() << "  lightnessF():" << gray.lightnessF(); // 約 0.501961
    qDebug() << "  valueF():" << gray.valueF();         // 約 0.501961

    return a.exec();
}

知覚的な明るさ(輝度・Luminance)を計算する

人間の目が感じる明るさ(輝度)は、RGB各成分の単純な平均ではありません。緑色が最も明るく感じられ、青色が最も暗く感じられます。そのため、画面上のテキストと背景色のコントラストを最大化するなど、人間が「明るい」「暗い」と感じる度合いを正確に把握したい場合は、輝度を計算する方法が最も適切です。

輝度の計算式 (sRGB): 一般的な sRGB 色空間における輝度 (Luminance) の計算式は以下の通りです。 L=0.2126×Rlinear​+0.7152×Glinear​+0.0722×Blinear​

ここで、Rlinear​,Glinear​,Blinearはガンマ補正が適用されていない線形なRGB値です。Qtの redF(), greenF(), blueF()0.0 から 1.0 の範囲で浮動小数点のRGB値を返しますが、これらは通常ガンマ補正された値です。厳密な輝度を計算するには、線形RGBに変換する必要があります。

線形RGBへの変換 (sRGBの場合、簡略化された逆ガンマ補正): Clinear​=(CsRGB​/255.0)2.2 または Clinear​=Cfloat​×Cfloat(Qtの float RGB値に対して)

用途:

  • 特定の明るさのしきい値で画像を二値化する場合。
  • 画像処理で、人間の知覚に基づいた明るさ調整を行いたい場合。
  • 背景色とテキスト色のコントラスト比を計算し、WCAG (Web Content Accessibility Guidelines) などのアクセシビリティ要件を満たすか確認する場合。

プログラミング例

#include <QCoreApplication>
#include <QColor>
#include <QDebug>
#include <QtMath> // qPow() を使用するために必要

// RGB値を線形空間に変換するヘルパー関数 (sRGBの場合の簡略化された逆ガンマ補正)
// QColor::redF() などは0.0-1.0の範囲で、sRGBガンマカーブが適用されていると仮定
float toLinear(float c_srgb) {
    // 厳密には sRGB の変換式は複雑ですが、簡略化のために power law で 2.2 を使用
    return qPow(c_srgb, 2.2);
}

// 知覚的な明るさ(輝度)を計算する関数
float calculateLuminance(const QColor &color) {
    if (!color.isValid()) {
        return 0.0f; // 無効な色は輝度0とみなす
    }

    float r = color.redF();
    float g = color.greenF();
    float b = color.blueF();

    // 線形RGB値に変換
    float r_linear = toLinear(r);
    float g_linear = toLinear(g);
    float b_linear = toLinear(b);

    // 輝度計算式
    return 0.2126f * r_linear + 0.7152f * g_linear + 0.0722f * b_linear;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QColor red(255, 0, 0); // 赤
    QColor green(0, 255, 0); // 緑
    QColor blue(0, 0, 255); // 青
    QColor black(0, 0, 0); // 黒
    QColor white(255, 255, 255); // 白
    QColor gray(128, 128, 128); // 灰色

    qDebug() << "--- 知覚的な明るさ (輝度/Luminance) の計算 ---";

    qDebug() << "Red (RGB: 255, 0, 0) Luminance:" << calculateLuminance(red);     // 他の色より低め
    qDebug() << "Green (RGB: 0, 255, 0) Luminance:" << calculateLuminance(green);   // 最も高め
    qDebug() << "Blue (RGB: 0, 0, 255) Luminance:" << calculateLuminance(blue);    // 最も低め
    qDebug() << "Black (RGB: 0, 0, 0) Luminance:" << calculateLuminance(black);   // 0.0 に近い
    qDebug() << "White (RGB: 255, 255, 255) Luminance:" << calculateLuminance(white); // 1.0 に近い
    qDebug() << "Gray (RGB: 128, 128, 128) Luminance:" << calculateLuminance(gray); // 約 0.21 (HLSの0.5とは異なる)

    // テキスト色の自動切り替えにおける輝度の利用
    qDebug() << "\n--- 輝度に基づいたテキスト色の自動切り替え ---";
    QColor backgroundColor = green; // 例として緑の背景
    float lum = calculateLuminance(backgroundColor);
    qDebug() << "Background Luminance:" << lum;

    if (lum > 0.179) { // WCAG 2.1 の推奨輝度しきい値 (一般的な経験則)
        qDebug() << "背景が明るいため、テキストは黒にすべきです。";
    } else {
        qDebug() << "背景が暗いため、テキストは白にすべきです。";
    }

    return a.exec();
}

注意: toLinear 関数は sRGB の逆ガンマ補正を簡略化したものです。より厳密な sRGB から線形空間への変換は、以下のようになります。

float srgbToLinear(float val) {
    if (val <= 0.04045f) {
        return val / 12.92f;
    } else {
        return qPow((val + 0.055f) / 1.055f, 2.4f);
    }
}
// そして calculateLuminance で toLinear の代わりに srgbToLinear を使用

RGBの最大値・平均値・最小値に基づく簡易的な明るさ (QColor::redF(), greenF(), blueF())

HLSやHSVの変換を行わず、単純にRGB成分の値から明るさを推測する方法です。これは最も単純ですが、知覚的な明るさとの乖離が大きくなる可能性があります。

  • 最小成分 (Min component): min(R, G, B)
  • 平均成分 (Average component): (R + G + B) / 3
  • 最大成分 (Max component): max(R, G, B)。これはHSVのValueに似た概念です。

用途:

  • 白黒画像への変換など、各ピクセルの明るさを大まかに把握したい場合。
  • パフォーマンスが最優先され、厳密な知覚的明るさが不要な場合。
  • 非常に単純な明るさの比較が必要な場合。
#include <QCoreApplication>
#include <QColor>
#include <QDebug>
#include <algorithm> // std::max, std::min を使用するために必要

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QColor color(10, 200, 50); // 緑が強めの色
    QColor black(0, 0, 0);
    QColor white(255, 255, 255);

    float r = color.redF();
    float g = color.greenF();
    float b = color.blueF();

    qDebug() << "--- RGB成分に基づく簡易的な明るさ ---";
    qDebug() << "Color (RGB: 10, 200, 50)";

    // 最大成分
    float maxComponent = std::max({r, g, b});
    qDebug() << "  Max Component (like HSV Value):" << maxComponent;

    // 平均成分
    float avgComponent = (r + g + b) / 3.0f;
    qDebug() << "  Average Component:" << avgComponent;

    // 最小成分
    float minComponent = std::min({r, g, b});
    qDebug() << "  Min Component:" << minComponent;

    qDebug() << "\nBlack (RGB: 0, 0, 0)";
    qDebug() << "  Max/Avg/Min Components:" << std::max({black.redF(), black.greenF(), black.blueF()})
             << (black.redF() + black.greenF() + black.blueF()) / 3.0f
             << std::min({black.redF(), black.greenF(), black.blueF()});

    qDebug() << "White (RGB: 255, 255, 255)";
    qDebug() << "  Max/Avg/Min Components:" << std::max({white.redF(), white.greenF(), white.blueF()})
             << (white.redF() + white.greenF() + white.blueF()) / 3.0f
             << std::min({white.redF(), white.greenF(), white.blueF()});

    return a.exec();
}
  • RGB成分の最大/平均/最小値: 非常に単純な明るさの指標が必要な場合に。
  • 輝度 (Luminance) の手動計算: 人間の知覚に近い明るさを扱いたい場合(例: アクセシビリティ、画像処理)に最適ですが、計算が複雑になります。
  • QColor::valueF(): HSVモデルのValue(明るさ)。純粋な明るさを調整し、色相と彩度を保ちたい場合に適しています。
  • QColor::lightnessF(): HLSモデルの明度。黒から色、色から白への変化に適しています。