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;
}
}
完全に動作します...遅くなったり、他の予期しない動作が発生したりするのでしょうか? 結局のところ、インデックス付きの画像であっても、ピクセル()関数を使用して色情報を取得していますが、実際には別の方法で保存する必要があります...失敗するはずです...
スキャンラインを使用して最初のバージョンを他の画像タイプで機能させる方法はありますか?
スキャンラインを使用してデータを取得する方法が推奨されるのはなぜですか?