QT GUI アプリケーションを構築しており、画像を開くために QImage を使用しています。私の問題は、QImage の bit() および scanline() メソッドを使用してピクセル レベルごとにアクセスする方法がわからないことです。
この投稿Qt QImage ピクセル操作の問題を見てきまし たが、これは各行の最初のピクセルのみです。これは正しいですか、それともすべて間違っていますか?
前もって感謝します
QT GUI アプリケーションを構築しており、画像を開くために QImage を使用しています。私の問題は、QImage の bit() および scanline() メソッドを使用してピクセル レベルごとにアクセスする方法がわからないことです。
この投稿Qt QImage ピクセル操作の問題を見てきまし たが、これは各行の最初のピクセルのみです。これは正しいですか、それともすべて間違っていますか?
前もって感謝します
は画像のscanlines
高さに対応し、列は画像の幅に対応します。
ドキュメントによると、プロトタイプはuchar* QImage::scanline(int i)
、または同様のconst
バージョンのように見えます。
ただし、コメンターが指摘したように、データはマシンのアーキテクチャとイメージに依存するため、直接使用しないでください。uchar *
代わりに、次のようなものを使用します。
QRgb *rowData = (QRgb*)img.scanLine(row);
QRgb pixelData = rowData[col];
int red = qRed(pixelData);
Kaleb の投稿からすぐにはわからないかもしれませんが、以下は Format_RGB32 画像にピクセルを設定するために機能します。
// Get the line we want
QRgb *line = (QRgb *)image->scanLine(row_index);
// Go to the pixel we want
line += col_index;
// Actually set the pixel
*line = qRgb(qRed(color), qGreen(color), qBlue(color));
答えは私にはうまくいきませんでした。私のシステムでは、データが 32 ビットに揃えられていないようです。正しいデータを取得するには、私のシステムでこれを行う必要がありました:
for(uint32_t Y = 0; Y < mHeight; ++Y)
{
uint8_t* pPixel = Image.scanLine(Y);
for(uint32_t X = 0; X < mWidth; ++X)
{
const int Blue = *pPixel++;
const int Green = *pPixel++;
const int Red = *pPixel++;
uint8_t GrayscalePixel = (0.21f * Red) + (0.72f * Green) + (0.07 * Blue);
}
}