13

QImageの各ピクセルからRGBを抽出したいと思います。理想的には、img.bits()関数を使用したいと思います。

QImage img;

if( img.load("Red.jpg") )
{
    uchar *bits = img.bits();

    for (int i = 0; i < 12; i++)
    {
        std::cout << (int) bits[i] << std::endl;
    }
}

返されたビットを操作する方法は?写真はペイントで作成された真っ赤な画像なので、私はすべて赤を期待していました。しかし、私は36、27、237、255、36などを取得します...

4

4 に答える 4

16
QImage img( "Red.jpg" );

if ( false == img.isNull() )
{
    QVector<QRgb> v = img.colorTable(); // returns a list of colors contained in the image's color table.

    for ( QVector<QRgb>::const_iterator it = v.begin(), itE = v.end(); it != itE; ++it )
    {
        QColor clrCurrent( *it );
        std::cout << "Red: " << clrCurrent.red()
                  << " Green: " << clrCurrent.green()
                  << " Blue: " << clrCurrent.blue()
                  << " Alpha: " << clrCurrent.alpha()
                  << std::endl;
    }
}

ただし、上記のこの例では、カラーテーブルが返されます。カラーテーブルに同じ色が2回含まれることはありません。出現順に1回追加されます。
各ピクセルの色を取得したい場合は、次の行を使用できます。

for ( int row = 1; row < img.height() + 1; ++row )
    for ( int col = 1; col < img.width() + 1; ++col )
    {
        QColor clrCurrent( img.pixel( row, col ) );

        std::cout << "Pixel at [" << row << "," << col << "] contains color ("
                  << clrCurrent.red() << ", "
                  << clrCurrent.green() << ", "
                  << clrCurrent.blue() << ", "
                  << clrCurrent.alpha() << ")."
                  << std::endl;
    }
于 2012-09-12T07:08:33.260 に答える
6

の参照bits()

最初のピクセルデータへのポインタを返します。これはscanLine(0)と同等です。

したがって、リファレンスを確認するとscanLine()

32 bppの画像データにアクセスしている場合は、返されたポインターをQRgb *(QRgbのサイズは32ビット)にキャストし、それを使用してピクセル値の読み取り/書き込みを行います。ピクセル形式は基盤となるプラットフォームのバイト順序に依存するため、uchar*ポインターを直接使用することはできません。qRed()、qGreen()、qBlue()、およびqAlpha()を使用してピクセルにアクセスします。

もう1つのオプションは、おそらくpixel()メンバー関数です。

お役に立てば幸いです。

于 2012-09-12T06:44:34.910 に答える
4

bits()関数を使用する際の問題の1つは、元の画像の形式を知る必要があることです。convertToFormatを使用してRGBに変換する必要があります。

img = img.convertToFormat(QImage::Format_RGB888);

これで、bits()を呼び出すと、データは適切なデータアライメントを備えたRGB形式になります。

uchar *bits = img.bits();

for (int i = 0; i < (img.width() * img.height() * 3); i++)
{
    std::cout << (int) bits[i] << std::endl;
}
于 2012-09-12T20:23:04.480 に答える
0

Qt 5.6ではQColor QImage::pixelColor(int x, int y)メソッドが導入されたため、画像のピクセルから直接色情報を取得できます。

于 2020-06-20T08:07:23.810 に答える