Domanda

Sto costruendo un applicazione QT GUI e uso QImage per l'apertura di immagini. Il mio problema è che non riesco a capire come utilizzare po 'di QImage () e scanline () metodi per ottenere l'accesso a ogni livello di pixel.

Ho visto questo post Qt Qimage problemi di manipolazione dei pixel ma questo è solo per il primo pixel di ogni riga. È questo corretto o ho sbagliato tutto?

grazie in anticipo

È stato utile?

Soluzione

Il scanlines corrispondere l'altezza dell'immagine, le colonne corrispondono alla larghezza dell'immagine.

Secondo la documentazione, il prototipo si presenta come uchar* QImage::scanline(int i), o una versione const simile.

Ma, come un commentatore ha sottolineato, perché i dati dipende l'architettura e immagine della macchina, si dovrebbe non utilizzare il uchar * direttamente. Invece, usare qualcosa come il seguente:

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

Altri suggerimenti

Può non essere immediatamente evidente dal post di Kaleb, ma i seguenti lavori per l'impostazione di un pixel un'immagine Format_RGB32 via.

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

La risposta non ha funzionato per me. Sembra che, i dati non sono a 32 bit allineato sul mio sistema. Per ottenere i dati corretti, sul mio sistema ho dovuto fare questo:

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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top