0

QImage で画像の色にアクセスしようとしています。

私がドキュメントで最も見つけた方法は、スキャンライン関数に基づいています...

私が試したところ、うまくいきました... RGB32画像で。正確な方法を使用して 8 ビットのインデックス付き画像またはモノクロ画像のカラー データを取得すると、驚くべき結果と不快な結果が得られました。

これは私のコードでした:

// note RGBTriple is a struct containing unsigned R, G, B
// rgbImage.pixels is a RGBTriple* array

RGBTriple* pTriple = rgbImage.pixels;
for (int y = 0; y < source.height(); y++)
{
    const unsigned char* pScanLine = source.scanLine(y);
    for (int x = 0; x < source.width(); x++)
    {
         QRgb* color = (QRgb*)pScanLine;
         pTriple->R = qRed(*color);
         pTriple->G = qGreen(*color);
         pTriple->B = qBlue(*color);
         ++pTriple;
         pScanLine += 4;
    }
}

8 ビットのインデックス付きまたはモノクロの画像で同じコードを実行すると、色を取得する際にエラーが発生しました。ドキュメントによると、スキャンラインは 32b の倍数に揃えられていますが、これは 8 と 2 の倍数であるため、問題になるとは思いませんでした。

すべての種類の入力画像で正しい結果が得られないことがわかったら、次のように変更しました

RGBTriple* pTriple = rgbImage.pixels;
for (int y = 0; y < source.height(); y++)
{
    for (int x = 0; x < source.width(); x++)
    {
        pTriple->R = qRed(source.pixel(x, y));
        pTriple->G = qGreen(source.pixel(x, y));
        pTriple->B = qBlue(source.pixel(x, y));
        ++pTriple;
    }
}

完全に動作します...遅くなったり、他の予期しない動作が発生したりするのでしょうか? 結局のところ、インデックス付きの画像であっても、ピクセル()関数を使用して色情報を取得していますが、実際には別の方法で保存する必要があります...失敗するはずです...

スキャンラインを使用して最初のバージョンを他の画像タイプで機能させる方法はありますか?

スキャンラインを使用してデータを取得する方法が推奨されるのはなぜですか?

4

1 に答える 1

1

私が試したところ、うまくいきました... RGB32画像で。正確な方法を使用して 8 ビットのインデックス付き画像またはモノクロ画像のカラー データを取得すると、驚くべき結果と不快な結果が得られました。

インデックス付き画像とモノクロ画像は異なる形式であるため、驚くことはありません。RGB32あなたが投稿した最初のコード スニペットは、メモリ内でのレイアウト方法(およびRGB32レイアウトのみ)に関する知識に基づいています。

考えてみてください。モノクロ画像R=G=Bで。したがって、メモリに保存する必要があるのは 1 つのチャンネルだけです。

内部で RGB 画像を取得することが目標の場合は、QImage::convertToFormat()rgbImage.pixelsを使用します。

QImage source;
QImage dest =  source.convertToFormat( QImage::Format_RGB888 );
memcpy(rgbImage.pixels, dest.bits(),dest.byteCount () );
于 2014-08-28T15:54:34.320 に答える