13


3

QT QImageピクセル操作

QT GUIアプリケーションを構築しており、QImageを使用して画像を開きます。 私の問題は、QImageのbit()メソッドとscanline()メソッドを使用してピクセルレベルでアクセスする方法がわからないことです。

私はこの投稿をhttps://stackoverflow.com/questions/857962/qt-qimage-pixel-manipulation-problems[Qt QImageピクセル操作の問題]を見ましたが、これは各行の最初のピクセルのみです。 これは正しいですか、それとも間違っていますか?

前もって感謝します

3 Answer


14


http://qt-project.org/doc/qt-4.8/qimage.html#scanLine [scanlines]は画像の高さに対応し、列は画像の幅に対応します。

ドキュメントによると、プロトタイプは「uchar * QImage

scanline(int i)」または同様の「const」バージョンのように見えます。

しかし、コメンターが指摘したように、データはマシンのアーキテクチャとイメージに依存しているため、「uchar *」を直接使用しないでください。 代わりに、次のようなものを使用します。

QRgb *rowData = (QRgb*)img.scanLine(row);
QRgb pixelData = rowData[col];
int red = qRed(pixelData);


13


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));


0


答えは私にはうまくいきませんでした。 私のシステムでは、データが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);
    }
}