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などを取得します...
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;
}
bits()
のリファレンスは次のように述べています。
最初のピクセルデータへのポインタを返します。これはscanLine(0)と同等です。
したがって、チェックすると scanLine()
の参照
32 bpp画像データにアクセスしている場合は、返されたポインターをQRgb *(QRgbのサイズは32ビット)にキャストし、それを使用してピクセル値の読み取り/書き込みを行います。ピクセル形式は基盤となるプラットフォームのバイト順序に依存するため、uchar *ポインターを直接使用することはできません。 qRed()、qGreen()、qBlue()、およびqAlpha()を使用してピクセルにアクセスします。
もう1つのオプションは、おそらく pixel()
メンバー関数です。
お役に立てば幸いです。
Bits()関数を使用する際の問題の1つは、元の画像の format を知る必要があることです。 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;
}