Pregunta

Estoy construyendo una aplicación QT GUI y uso QImage para las imágenes de apertura. Mi problema es que no puedo encontrar la manera de utilizar bits de QImage () y línea de escaneo () métodos para obtener acceso al por nivel de píxel.

he visto esta entrada Qt QImage problemas de manipulación de píxeles pero esto es sólo para el primer píxel de cada fila. ¿Es esto correcto o lo tengo todo mal?

gracias de antemano

¿Fue útil?

Solución

El scanlines corresponden a la de la altura de la imagen, las columnas corresponden a la anchura de la imagen.

De acuerdo con los documentos, las miradas como prototipo uchar* QImage::scanline(int i) o una versión const similar.

Pero, como un comentarista señaló, ya que los datos depende de la arquitectura de la máquina y la imagen, que debe no utilizar el uchar * directamente. En su lugar, el uso de algo como lo siguiente:

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

Otros consejos

Puede que no sea inmediatamente obvio desde el puesto de Kaleb, pero las siguientes obras para el establecimiento de un píxel de una imagen en 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 respuesta no funcionó para mí. Parece que, los datos de 32 bits no está alineado en mi sistema. Para obtener los datos correctos, en mi sistema que tenía que hacer esto:

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);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top