QRgbaFloat::fromRgba64()を使いこなして、Qt GUIプログラミングをレベルアップ!


QRgbaFloat::fromRgba64()は、Qt GUIライブラリで提供される関数で、16ビット整数値4つで表現されたRGBAカラー値を、浮動小数点値4つで表現されたQRgbaFloat型に変換します。この関数は、画像処理やグラフィックデザインなど、さまざまな場面でカラー値を扱う際に役立ちます。

使い方

QRgbaFloat::fromRgba64()関数は、以下の引数を取ります。

  • alpha: アルファ値の16ビット整数値
  • blue: 青色成分の16ビット整数値
  • green: 緑色成分の16ビット整数値
  • red: 赤色成分の16ビット整数値

これらの引数を使用して、QRgbaFloat型のインスタンスを作成できます。

QRgbaFloat color = QRgbaFloat::fromRgba64(0xFFFF, 0x0000, 0x0000, 0xFF00);

この例では、赤色255、緑色0、青色0、アルファ100%のQRgbaFloat型インスタンスを作成しています。

戻り値

QRgbaFloat::fromRgba64()関数は、変換されたQRgbaFloat型インスタンスを返します。

以下のコードは、QRgbaFloat::fromRgba64()関数を使用して、さまざまなカラー値を生成する例です。

QRgbaFloat red = QRgbaFloat::fromRgba64(0xFFFF, 0x0000, 0x0000, 0xFF00);
QRgbaFloat green = QRgbaFloat::fromRgba64(0x0000, 0xFFFF, 0x0000, 0xFF00);
QRgbaFloat blue = QRgbaFloat::fromRgba64(0x0000, 0x0000, 0xFFFF, 0xFF00);
QRgbaFloat black = QRgbaFloat::fromRgba64(0x0000, 0x0000, 0x0000, 0xFF00);
QRgbaFloat white = QRgbaFloat::fromRgba64(0xFFFF, 0xFFFF, 0xFFFF, 0xFF00);
  • QRgbaFloat::fromRgba64()関数は、Qt GUI 5.12以降で使用できます。
  • QRgbaFloat型は、QColor型に変換することもできます。
  • QRgbaFloat::fromRgba64()関数は、QRgbaFloat16型とQRgbaFloat32型でも使用できます。


#include <QApplication>
#include <QLabel>
#include <QVBoxLayout>

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

  // カラーパレットを作成
  QVBoxLayout paletteLayout;
  for (int i = 0; i < 16; ++i) {
    QRgbaFloat color = QRgbaFloat::fromRgba64(
        (i << 4) | i, (i << 4) | i, (i << 4) | i, 0xFF00);
    QLabel *label = new QLabel;
    label->setFixedSize(50, 50);
    label->setStyleSheet(QString("background-color: %1;").arg(color.name()));
    paletteLayout.addWidget(label);
  }

  // ウィンドウを作成
  QWidget window;
  window.setLayout(&paletteLayout);
  window.setWindowTitle("カラーパレット");
  window.show();

  return app.exec();
}

このコードを実行すると、以下のようなウィンドウが表示されます。

例2: 画像のカラー変換

この例では、QRgbaFloat::fromRgba64()関数を使用して、画像のカラーをグレースケールに変換します。

#include <QApplication>
#include <QLabel>
#include <QImage>
#include <QVBoxLayout>

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

  // 画像を読み込む
  QImage image("image.png");

  // グレースケール画像を作成
  QImage grayscaleImage = image;
  for (int y = 0; y < image.height(); ++y) {
    for (int x = 0; x < image.width(); ++x) {
      QRgb pixel = image.pixel(x, y);
      QRgbaFloat color = QRgbaFloat::fromRgba(pixel);
      float grayscale = 0.2126 * color.red() +
                      0.7152 * color.green() +
                      0.0722 * color.blue();
      QRgbaFloat grayscaleColor = QRgbaFloat::fromHsl(grayscale, 1.0, 1.0);
      grayscaleImage.setPixel(x, y, grayscaleColor.toRgba());
    }
  }

  // ウィンドウを作成
  QVBoxLayout layout;
  QLabel *originalLabel = new QLabel;
  originalLabel->setPixmap(image.scaledToWidth(250));
  layout.addWidget(originalLabel);

  QLabel *grayscaleLabel = new QLabel;
  grayscaleLabel->setPixmap(grayscaleImage.scaledToWidth(250));
  layout.addWidget(grayscaleLabel);

  QWidget window;
  window.setLayout(&layout);
  window.setWindowTitle("画像のカラー変換");
  window.show();

  return app.exec();
}


この関数の代替方法として、以下の方法が考えられます。

QColor::fromRgba64()関数を使用する

QColor::fromRgba64()関数は、16ビット整数値4つで表現されたRGBAカラー値を、QColor型に変換します。QRgbaFloat型に変換したい場合は、QColor::toRgbaF()関数を使用することで、QRgbaFloat型に変換できます。

QRgbaFloat color = QColor::fromRgba64(0xFFFF, 0x0000, 0x0000, 0xFF00).toRgbaF();

QVector<float>を使用する

QVector<float>を使用して、4つの浮動小数点値を格納することもできます。

QVector<float> color = {1.0, 0.0, 0.0, 1.0};

手動で変換する

以下の式を使用して、手動で変換することもできます。

QRgbaFloat color;
color.setRed(static_cast<float>(red) / 65535.0);
color.setGreen(static_cast<float>(green) / 65535.0);
color.setBlue(static_cast<float>(blue) / 65535.0);
color.setAlpha(static_cast<float>(alpha) / 65535.0);

それぞれの方法のメリットとデメリット

  • 手動で変換する
    • メリット: 最も柔軟性が高い。
    • デメリット: コードが複雑になる。
  • QVector<float>を使用する
    • メリット: シンプルで分かりやすい。
    • デメリット: QRgbaFloat型に明示的に変換する必要がある。
  • QColor::fromRgba64()関数を使用する
    • メリット: QColor型は、Qt GUIライブラリで広く使用されているため、使いやすい。
    • デメリット: QRgbaFloat型に変換するために、QColor::toRgbaF()関数を使用する必要がある。
  • QRgbaFloat型を直接使用したい場合は、QVector<float>を使用するか、手動で変換する必要があります。
  • シンプルで分かりやすい方法が必要な場合は、QColor::fromRgba64()関数を使用するのがおすすめです。