Question

Je construis une application GUI QT et utiliser QImage pour ouvrir des images. Mon problème est que je ne peux pas comprendre comment utiliser le bit de QImage () et ligne de balayage () méthodes pour obtenir l'accès à chaque niveau de pixel.

Je l'ai vu ce post mais ceci est seulement pour le premier pixel de chaque ligne. Est-ce exact ou je l'ai eu tout faux?

merci à l'avance

Était-ce utile?

La solution

scanlines correspondre à la hauteur de l'image, les colonnes correspondent à la largeur de l'image.

Selon les documents, le prototype ressemble uchar* QImage::scanline(int i), ou une version similaire const.

Mais, comme commentateur a fait remarquer, parce que les données dépend de l'architecture de la machine et de l'image, vous devriez pas utiliser directement le uchar *. Au lieu de cela, utiliser quelque chose comme ce qui suit:

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

Autres conseils

Il peut ne pas être immédiatement évident de poste de Kaleb, mais les œuvres suivantes pour définir un pixel sur une image 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));

La réponse ne fonctionne pas pour moi. Il ressemble, les données ne sont pas 32bit aligné sur mon système. Pour obtenir les données correctes, sur mon système, je devais faire ceci:

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);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top