入門から応用まで:Qt QColor::saturation()を使った色操作

2025-05-27

彩度とは?

彩度とは、色の鮮やかさや純度を表す指標です。

  • 彩度が0の色:完全に無彩色(白、黒、灰色)
  • 彩度が低い色:くすんだ色、灰色に近い色(例:ピンクがかった灰色、薄い水色)
  • 彩度が高い色:鮮やかで純粋な色(例:真っ赤な赤、鮮やかな青)

色には、RGB (Red, Green, Blue) 以外にも、HSV (Hue, Saturation, Value) や HSL (Hue, Saturation, Lightness) といった色空間があります。QColor::saturation() メソッドは、通常HSV色空間における彩度を返します。

関数の詳細

  • const修飾子: const が付いているため、このメソッドはQColor オブジェクトの状態を変更しません。
  • 戻り値の型: int
    • この関数は int 型の値を返します。
    • HSV色空間における彩度は、通常0から255までの範囲で表現されます。0が最も彩度が低く(灰色に近く)、255が最も彩度が高い(鮮やか)です。

使用例

#include <QColor>
#include <QDebug>

int main() {
    QColor red(255, 0, 0); // 純粋な赤 (RGB)
    QColor lightBlue(173, 216, 230); // 薄い青 (RGB)
    QColor gray(128, 128, 128); // 灰色 (RGB)

    qDebug() << "Red saturation:" << red.saturation();        // 255に近い値
    qDebug() << "Light Blue saturation:" << lightBlue.saturation(); // 中程度の値
    qDebug() << "Gray saturation:" << gray.saturation();      // 0に近い値

    return 0;
}

このコードを実行すると、それぞれの色が持つ彩度の値が出力されます。純粋な赤は彩度が高く、灰色は彩度が非常に低い(または0)ことがわかるでしょう。



int QColor::saturation() に関連する一般的なエラーとトラブルシューティング

想定外の彩度値 (0-255の範囲外、または期待値と異なる)

問題
saturation() が返す値が、期待していた0〜255の範囲外である、または、目で見た色と彩度値が一致しないと感じる場合。

考えられる原因とトラブルシューティング

  • 浮動小数点精度 (Floating Point Precision) の影響
    QColor には、setRgbF()saturationF() のように浮動小数点値で色成分を扱うメソッドもあります。これらを使用した場合、内部的には16ビット整数で値を格納するため、設定した値と取得する値の間にごくわずかな丸め誤差が生じる可能性があります。saturation() は整数値を返しますが、saturationF() を使用している場合は、その影響を考慮する必要があります。
    • 確認
      saturation() は整数値を返しますが、元の色の設定にF系のメソッドを使用した場合に、期待通りの値が返らない場合は、丸め誤差の可能性を考慮します。
  • グレースケールの色
    完全に無彩色(白、黒、灰色)の彩度は通常0になります。これは正しい動作ですが、色があるはずなのに彩度が0になる場合は、その色が本当にグレースケールではないか確認してください。
    • 確認
      RGB値がすべて同じ場合(例:(128, 128, 128))は、彩度が0になるのが正常です。
  • 異なる色空間の理解不足
    QColor::saturation() は、通常HSV (Hue, Saturation, Value) 色空間の彩度を返します。しかし、HSL (Hue, Saturation, Lightness) 色空間における彩度を期待している場合、値が異なることがあります。特に、同じ「彩度」という言葉が色空間によって異なる意味を持つことがあるため注意が必要です。
    • 確認
      HSVとHSLの彩度の違いを理解し、どちらの彩度が必要かを確認します。HSLの彩度が必要な場合は、QColor::hslSaturation() を使用します。
      QColor myColor(Qt::red);
      qDebug() << "HSV Saturation:" << myColor.saturation(); // または myColor.hsvSaturation()
      qDebug() << "HSL Saturation:" << myColor.hslSaturation();
      
  • 無効な QColor オブジェクト
    QColor オブジェクトが有効な色を表していない場合、saturation() の結果は未定義になります。例えば、無効なRGB値で初期化された場合などです。
    • 確認
      QColor::isValid() メソッドを使用して、色オブジェクトが有効かどうかを確認します。
      QColor invalidColor(-10, 200, 50); // 無効なR値
      if (!invalidColor.isValid()) {
          qDebug() << "Invalid color!";
          // エラー処理
      }
      

QML/Python (PyQt/PySide) 環境での問題

問題
C++ではなく、QMLやPython (PyQt/PySide) で QColor::saturation を使用している場合に、予期せぬ挙動や警告が発生する。

考えられる原因とトラブルシューティング

  • Pythonバインディングの挙動
    PyQtやPySideでは、C++のQt APIをPythonにバインドしているため、Pythonの型システムとC++の型システムの間の変換で問題が発生する可能性があります。int を返す saturation() に関しては大きな問題は少ないですが、他のQColor関連のメソッドで型エラーが発生することがあります。
    • 確認
      Pythonの公式ドキュメントやPyQt/PySideのドキュメントで、QColor オブジェクトの取り扱い方について確認してください。
  • QMLの最適化と型変換
    QMLは内部で文字列から型への変換を最適化しようとすることがあり、これが原因で警告が出る場合があります。例えば、QColor::setNamedColor() に関する警告など。saturation() 自体は直接的な問題になりにくいですが、色設定に問題がある場合、その後の彩度取得にも影響が出る可能性があります。
    • 確認
      QMLで色を文字列で設定している場合、正しい形式であることを確認してください(例:#RRGGBB)。Qtの公式ドキュメントで推奨される色の設定方法に従ってください。

実行時のクラッシュや未定義動作

問題
saturation() を呼び出すと、アプリケーションがクラッシュする、または動作が不安定になる。

  • スレッドセーフティの問題
    複数のスレッドから同時に同じ QColor オブジェクトの変更と読み取りを行っている場合、競合状態が発生し、予期せぬ結果やクラッシュにつながる可能性があります。
    • 確認
      QColor は暗黙的な共有 (Implicit Sharing) を利用しているため、通常は値渡しで安全に扱えます。しかし、複数のスレッドから単一の QColor オブジェクトを直接変更する場合は、ミューテックスなどによる同期が必要になることがあります。saturation()const メソッドなので、読み取り自体はスレッドセーフですが、オブジェクトが別のスレッドで同時に変更されている場合は注意が必要です。
  • NULLポインタ参照
    QColor オブジェクトが有効なポインタでない状態で saturation() を呼び出している可能性があります(C++の場合)。
    • 確認
      QColor オブジェクトが正しく初期化され、有効なポインタを指していることを確認してください。
      QColor* colorPtr = nullptr;
      // ... (colorPtrがどこかで初期化されていない場合)
      // colorPtr->saturation(); // クラッシュの原因
      
  • 他の色のプロパティと比較
    彩度だけでなく、hue() (色相) や value() (明度/輝度) も同時に取得し、色全体の構成を把握することで、なぜ特定の彩度値になるのかを理解できる場合があります。
  • 最小限の再現コード
    問題が発生した場合、その問題を再現できる最小限のコードスニペットを作成してみてください。これにより、問題を特定しやすくなります。
  • Qtドキュメントの参照
    QColor クラスの公式ドキュメント(特に "Detailed Description" セクションや "Integer vs. Floating Point Precision" のセクション)をよく読み、各メソッドの動作原理と期待される値を理解することが重要です。
  • デバッグ出力の活用
    qDebug()std::cout を使って、QColor オブジェクトのRGB値、HSV値、HSL値、そして isValid() の結果を定期的に出力し、色の状態を詳細に把握してください。


基本的な彩度の取得

最も基本的な使い方は、QColor オブジェクトを作成し、その saturation() メソッドを呼び出すことです。

#include <QCoreApplication>
#include <QColor>
#include <QDebug> // デバッグ出力をするために必要

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

    // いくつかの色を定義
    QColor red(255, 0, 0);       // 純粋な赤 (高彩度)
    QColor gray(128, 128, 128);  // 灰色 (彩度0)
    QColor lightBlue(173, 216, 230); // 薄い水色 (中程度の彩度)
    QColor darkGreen(0, 100, 0); // 暗い緑 (高彩度だが暗い)

    // 各色の彩度を取得して出力
    qDebug() << "赤の彩度 (Saturation of Red):" << red.saturation();
    qDebug() << "灰色の彩度 (Saturation of Gray):" << gray.saturation();
    qDebug() << "薄い水色の彩度 (Saturation of Light Blue):" << lightBlue.saturation();
    qDebug() << "暗い緑の彩度 (Saturation of Dark Green):" << darkGreen.saturation();

    return 0;
}

解説
QColor::saturation() は、HSV (Hue, Saturation, Value) 色空間における彩度を0から255の整数で返します。

  • 薄い水色や暗い緑は、その鮮やかさに応じて0から255の間の値が返されます。
  • 灰色 ((128, 128, 128)) は無彩色なので、彩度は 0 になります。
  • 純粋な赤 ((255, 0, 0)) は最も鮮やかであるため、彩度は 255 に近くなります。

彩度を基にした条件分岐や処理

取得した彩度の値を使って、色の鮮やかさに応じた処理を行うことができます。

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

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

    QColor someColor(50, 150, 200); // ある色

    int saturation = someColor.saturation();
    qDebug() << "色の彩度 (Saturation of the color):" << saturation;

    if (saturation > 200) {
        qDebug() << "この色は非常に鮮やかです。 (This color is very vibrant.)";
        // 例: 鮮やかな色に特別なエフェクトを適用する
    } else if (saturation < 50) {
        qDebug() << "この色はくすんでいます。 (This color is dull.)";
        // 例: くすんだ色を強調表示する
    } else {
        qDebug() << "この色は中程度の鮮やかさです。 (This color has medium vibrancy.)";
    }

    // グレースケールかどうかの判定
    if (saturation == 0) {
        qDebug() << "この色はグレースケールです。 (This color is grayscale.)";
    } else {
        qDebug() << "この色はグレースケールではありません。 (This color is not grayscale.)";
    }

    return 0;
}

解説
この例では、彩度の値に基づいてメッセージを表示しています。彩度が0の場合、その色は無彩色(灰色、黒、白)であることを判定できます。

彩度を調整した新しい色の作成

saturation() で彩度を取得した後、QColor::setHsv()QColor::toHsv() を使って彩度を変更した新しい色を作成することができます。

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

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

    QColor originalColor(255, 100, 0); // オレンジ色 (RGB)

    // 元の色のHSV成分を取得
    int h, s, v, a;
    originalColor.getHsv(&h, &s, &v, &a);

    qDebug() << "元の色 - 色相(H):" << h << ", 彩度(S):" << s << ", 明度(V):" << v;

    // 彩度を半分にする
    int newSaturation = s / 2;
    if (newSaturation < 0) newSaturation = 0; // 負の値にならないように
    if (newSaturation > 255) newSaturation = 255; // 255を超えないように

    QColor desaturatedColor;
    desaturatedColor.setHsv(h, newSaturation, v, a); // 新しい彩度で色を設定

    qDebug() << "彩度を半分にした色 - 色相(H):" << desaturatedColor.hue()
             << ", 彩度(S):" << desaturatedColor.saturation()
             << ", 明度(V):" << desaturatedColor.value();

    // 完全な彩度(最も鮮やか)の同じ色相の色を作成
    QColor fullSaturationColor;
    fullSaturationColor.setHsv(h, 255, v, a);

    qDebug() << "完全な彩度の色 - 色相(H):" << fullSaturationColor.hue()
             << ", 彩度(S):" << fullSaturationColor.saturation()
             << ", 明度(V):" << fullSaturationColor.value();

    return 0;
}

解説

  1. originalColor.getHsv(&h, &s, &v, &a); で、元の色のHSV成分を取得します。
  2. newSaturation を計算し、新しい QColor オブジェクト desaturatedColorsetHsv() で初期化します。
  3. 同様に、fullSaturationColor を作成し、彩度を最大値の255に設定しています。 このようにして、元の色の彩度を基に、より鮮やかなくすんだ色や、逆に彩度を最大化した色を作成できます。

QColor には、HSVとHSLの両方の色空間に対応する彩度取得メソッドがあります。通常 saturation() はHSVの彩度を返しますが、明確に区別したい場合はそれぞれのメソッドを使用します。

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

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

    QColor purple(128, 0, 128); // 紫色 (RGB)

    // 一般的な saturation() (HSV彩度を返す)
    qDebug() << "通常 (HSV) の彩度 (Saturation (HSV)): " << purple.saturation();

    // 明示的にHSV彩度を取得
    qDebug() << "HSV彩度 (hsvSaturation()): " << purple.hsvSaturation();

    // HSL彩度を取得
    qDebug() << "HSL彩度 (hslSaturation()): " << purple.hslSaturation();

    return 0;
}

解説
同じ色であっても、HSVとHSLでは彩度の定義が異なるため、異なる値が返されることがあります。どちらの色空間の彩度が必要かを理解して使い分けることが重要です。



int QColor::saturation() の代替方法と関連メソッド

明示的なHSV彩度の取得: int QColor::hsvSaturation() const


  • #include <QCoreApplication>
    #include <QColor>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        QColor myColor(200, 50, 100); // ある色
    
        int hsvSat = myColor.hsvSaturation();
        qDebug() << "HSV Saturation (using hsvSaturation()):" << hsvSat;
    
        return 0;
    }
    
  • 用途
    • HSV色空間に特化した彩度が必要な場合。
    • コードの意図をより明確にしたい場合。
  • 説明
    QColor::saturation() は、内部的に QColor::hsvSaturation() を呼び出すことが多いです。そのため、hsvSaturation() を直接呼び出すことは、saturation() と同じ結果を期待できる、より明確な記述方法と考えることができます。特にコードの可読性を高め、HSV色空間の彩度であることを強調したい場合に有効です。

HSL彩度の取得: int QColor::hslSaturation() const

  • 注意
    hsvSaturation()hslSaturation() は、同じ色でも異なる値を返すことがほとんどです。

  • #include <QCoreApplication>
    #include <QColor>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        QColor myColor(200, 50, 100); // ある色
    
        int hslSat = myColor.hslSaturation();
        qDebug() << "HSL Saturation (using hslSaturation()):" << hslSat;
    
        return 0;
    }
    
  • 用途
    • HSL色空間の彩度が必要な場合。
    • Webカラーの扱いに近い彩度を計算したい場合。
  • 説明
    HSL (Hue, Saturation, Lightness) 色空間は、HSVとは異なる方法で色を表現します。特に「Lightness (明るさ)」が、HSVの「Value (明度)」とは異なるため、彩度の定義も異なります。HSLの彩度は、色がどれだけ灰色から離れているかを示す傾向が強く、Webデザインなどでよく使われます。

HSV色空間への変換と成分取得: void QColor::getHsv(int *h, int *s, int *v, int *a) const または QColor::toHsv()

  • 例 (toHsv)
    #include <QCoreApplication>
    #include <QColor>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        QColor myColor(Qt::blue); // 青色
    
        QColor hsvColor = myColor.toHsv();
        qDebug() << "Saturation (from toHsv().saturation()):" << hsvColor.saturation();
    
        return 0;
    }
    
  • 例 (getHsv)
    #include <QCoreApplication>
    #include <QColor>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        QColor myColor(Qt::green); // 緑色
    
        int h, s, v, a;
        myColor.getHsv(&h, &s, &v, &a);
    
        qDebug() << "Hue:" << h << ", Saturation:" << s << ", Value:" << v << ", Alpha:" << a;
        qDebug() << "Saturation (from getHsv):" << s; // ここで彩度を取得
    
        return 0;
    }
    
  • 用途
    • 彩度だけでなく、色相や明度も同時に必要な場合。
    • HSV成分を基に新しい色を作成する前処理。
  • 説明
    saturation() は彩度単体を取得しますが、色相 (Hue) や明度 (Value) も同時に必要な場合は、getHsv() を使うのが効率的です。このメソッドは、HSV成分をポインタで受け取り、一度の呼び出しで複数の成分を取得できます。また、toHsv() メソッドは、現在のRGB色からHSV色空間表現の QColor オブジェクトを返します。この返されたQColorオブジェクトに対してsaturation()を呼び出すことで、同じ結果を得られます。
  • 例 (toHsl)
    #include <QCoreApplication>
    #include <QColor>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        QColor myColor(Qt::cyan); // シアン色
    
        QColor hslColor = myColor.toHsl();
        qDebug() << "Saturation (from toHsl().saturation()):" << hslColor.saturation();
    
        return 0;
    }
    
  • 例 (getHsl)
    #include <QCoreApplication>
    #include <QColor>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        QColor myColor(Qt::magenta); // マゼンタ色
    
        int h, s, l, a;
        myColor.getHsl(&h, &s, &l, &a);
    
        qDebug() << "Hue:" << h << ", Saturation:" << s << ", Lightness:" << l << ", Alpha:" << a;
        qDebug() << "Saturation (from getHsl):" << s; // ここで彩度を取得
    
        return 0;
    }
    
  • 用途
    • HSLの色相、彩度、輝度が同時に必要な場合。
  • 説明
    getHsl() は、getHsv() と同様に、HSLの色相 (Hue)、彩度 (Saturation)、輝度 (Lightness) を一度に取得します。toHsl() は、現在のRGB色からHSL色空間表現の QColor オブジェクトを返します。

浮動小数点値での彩度取得: qreal QColor::saturationF() const

  • 注意
    hsvSaturationF()hslSaturationF() も存在します。

  • #include <QCoreApplication>
    #include <QColor>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        QColor myColor(255, 128, 0); // オレンジ色
    
        qreal satF = myColor.saturationF();
        qDebug() << "Saturation (floating point):" << satF;
    
        // 整数値に戻す例
        int satInt = static_cast<int>(satF * 255.0);
        qDebug() << "Saturation (integer from float):" << satInt;
    
        return 0;
    }
    
  • 用途
    • 彩度を0.0〜1.0の正規化された値で取得したい場合。
    • 浮動小数点演算が必要な場合。
  • 説明
    saturation() は0〜255の整数値を返しますが、saturationF() は0.0〜1.0の浮動小数点値を返します。より細かい精度で彩度を扱いたい場合や、他のシステムとの連携で0.0〜1.0の範囲が必要な場合に便利です。
メソッド名戻り値の型説明主な用途
saturation()int標準的な彩度取得 (通常HSV)最も一般的。HSV彩度が欲しい場合。
hsvSaturation()int明示的にHSV彩度を取得HSV彩度であることを強調したい場合。
hslSaturation()intHSL彩度を取得HSL彩度が必要な場合。
getHsv()voidHSVの色相、彩度、明度、アルファを一度に取得複数のHSV成分をまとめて取得したい場合。
toHsv()QColor現在の色をHSV色空間表現の QColor オブジェクトに変換するHSVとして色を操作したい場合。
getHsl()voidHSLの色相、彩度、輝度、アルファを一度に取得複数のHSL成分をまとめて取得したい場合。
toHsl()QColor現在の色をHSL色空間表現の QColor オブジェクトに変換するHSLとして色を操作したい場合。
saturationF()qreal彩度を0.0〜1.0の浮動小数点値で取得 (通常HSV)より高精度な彩度、または正規化された値が必要な場合。
hsvSaturationF()qreal明示的にHSV彩度を0.0〜1.0の浮動小数点値で取得
hslSaturationF()qrealHSL彩度を0.0〜1.0の浮動小数点値で取得

QColor::saturation() は非常に便利ですが、どの色空間の彩度を扱っているのか、また彩度以外の成分も必要かどうかに応じて、上記の代替メソッドや関連メソッドを適切に選択することが、より堅牢で意図が明確なコードを書く上で重要です。 Qtにおける QColor::saturation() は、色の彩度を取得するための主要なメソッドですが、いくつかの代替方法や関連するメソッドがあります。これらを理解することで、より柔軟な色の操作が可能になります。

明示的なHSV彩度 (hsvSaturation())

QColor::saturation() は、通常HSV (Hue, Saturation, Value) 色空間の彩度を返しますが、Qtには明示的にHSV彩度を取得するためのメソッド hsvSaturation() も用意されています。これは saturation() と同じ値を返しますが、コードの意図をより明確にするために使用できます。

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

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

    QColor myColor(Qt::green); // 緑色

    int saturation = myColor.saturation();
    int hsvSaturation = myColor.hsvSaturation(); // 明示的にHSV彩度を取得

    qDebug() << "QColor::saturation():" << saturation;
    qDebug() << "QColor::hsvSaturation():" << hsvSaturation;

    return 0;
}

解説
saturation()hsvSaturation() は同じ値を返します。hsvSaturation() を使うことで、この値がHSV色空間の彩度であることをプログラマーに明確に伝えることができます。

HSL彩度 (hslSaturation())

HSVとは異なるHSL (Hue, Saturation, Lightness) 色空間における彩度を取得したい場合は、hslSaturation() メソッドを使用します。HSVとHSLの彩度は定義が異なるため、同じ色でも異なる値が返されることに注意が必要です。

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

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

    QColor brightRed(255, 0, 0); // 明るい赤

    qDebug() << "明るい赤のHSV彩度 (hsvSaturation):" << brightRed.hsvSaturation();
    qDebug() << "明るい赤のHSL彩度 (hslSaturation):" << brightRed.hslSaturation();

    // 例: 明度が異なるが彩度が高い色
    QColor darkRed(150, 0, 0); // 暗い赤
    qDebug() << "暗い赤のHSV彩度 (hsvSaturation):" << darkRed.hsvSaturation();
    qDebug() << "暗い赤のHSL彩度 (hslSaturation):" << darkRed.hslSaturation();

    return 0;
}

解説
上記の例では、同じ「赤」でも明度が異なる場合、HSVとHSLの彩度がどのように変化するかを示しています。HSVの彩度が「色の純粋さ」を重視するのに対し、HSLの彩度は「無彩色からの距離」を重視する傾向があります。用途に応じて適切な彩度を選択することが重要です。

浮動小数点精度での彩度取得 (saturationF(), hsvSaturationF(), hslSaturationF())

Qtは、色の成分を0.0から1.0の浮動小数点数で扱うためのメソッドも提供しています。より精密な計算が必要な場合や、他のシステムとの連携で浮動小数点数が必要な場合に便利です。

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

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

    QColor myColor(173, 216, 230); // 薄い水色

    qDebug() << "整数彩度 (int saturation):" << myColor.saturation();
    qDebug() << "浮動小数点彩度 (qreal saturationF):" << myColor.saturationF();

    qDebug() << "HSV浮動小数点彩度 (hsvSaturationF):" << myColor.hsvSaturationF();
    qDebug() << "HSL浮動小数点彩度 (hslSaturationF):" << myColor.hslSaturationF();

    return 0;
}

解説
saturationF()hsvSaturationF()hslSaturationF() は、それぞれの彩度を qreal (通常は double または float) 型で0.0から1.0の範囲で返します。

QColor オブジェクトを特定のHsv/Hsl色空間に変換し、そこから彩度を含むすべての成分を取得する方法です。これは、彩度だけでなく、色相 (Hue) や明度/輝度 (Value/Lightness) も同時に操作したい場合に便利です。

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

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

    QColor originalColor(100, 200, 50); // 緑がかった色

    // 方法1: toHsv() で新しいQColorオブジェクトを作成し、そこから彩度を取得
    QColor hsvColor = originalColor.toHsv();
    qDebug() << "toHsv() 経由の彩度 (Saturation via toHsv()):" << hsvColor.saturation();
    qDebug() << "toHsv() 経由のH (Hue):" << hsvColor.hue();
    qDebug() << "toHsv() 経由のV (Value):" << hsvColor.value();

    // 方法2: getHsv() で直接成分を取得
    int h, s, v, a;
    originalColor.getHsv(&h, &s, &v, &a);
    qDebug() << "getHsv() 経由の彩度 (Saturation via getHsv()):" << s;
    qDebug() << "getHsv() 経由のH (Hue):" << h;
    qDebug() << "getHsv() 経由のV (Value):" << v;

    // HSLについても同様
    int h_hsl, s_hsl, l_hsl, a_hsl;
    originalColor.getHsl(&h_hsl, &s_hsl, &l_hsl, &a_hsl);
    qDebug() << "getHsl() 経由の彩度 (Saturation via getHsl()):" << s_hsl;
    qDebug() << "getHsl() 経由のL (Lightness):" << l_hsl;

    return 0;
}

解説

  • getHsv()getHsl() は、引数として渡されたポインタに直接HSV/HSL成分を書き込みます。これにより、中間オブジェクトを作成せずに効率的に成分を取得できます。
  • toHsv()toHsl() は、現在の色をそれぞれHSVまたはHSL色空間に変換した新しい QColor オブジェクトを返します。この新しいオブジェクトから、各成分(hue()saturation()/hsvSaturation()value() または hslHue()hslSaturation()lightness())を個別に取得できます。

int QColor::saturation() はHSV色空間の彩度を簡単に取得できる便利な関数ですが、必要に応じて以下の代替方法や関連メソッドを検討してください。

  • *F() 系のメソッド (例: saturationF(), hsvSaturationF(), hslSaturationF()): 浮動小数点精度で彩度を扱いたい場合。
  • hslSaturation(): HSL色空間の彩度が必要な場合。
  • hsvSaturation(): saturation() と同じ値だが、HSV彩度であることを明示したい場合。