Pregunta

Tengo una imagen que estoy tratando de mostrar en un Qimage.

Este es el fragmento de código que poca la imagen de las filas*cols:

    rgbMapped[row][col * 3] = red;

    rgbMapped[row][col * 3 + 1] = green;

    rgbMapped[row][col * 3 + 2] = blue;

Como puede ver, mi búfer de datos es "de las filas altas" y es "cols*3 de ancho"

RGBMapped es una matriz de char ** sin firmar. Así que de vuelta en mi código QT tengo lo siguiente:

QImage *qi = new QImage(getWidth(), getHeight(), QImage::Format_RGB888);

for (int h = 0; h< getHeight(); h++){
    memcpy(qi->scanLine(h), rgbMapped[h], getWidth()*3);
}
QPixmap p(QPixmap::fromImage(*qi,Qt::ColorOnly));

if(scene.items().contains(item)){
    scene.removeItem(item);
}
item = new ImagePixmapItem(p);
scene.addItem(item);
ui->graphicsView->setScene(&scene);
ui->graphicsView->show();

ImagePixMapitem es un QgraphicsPixMapitem que he creado para permitirme interceptar algunos eventos del ratón, pero no hago de todos modos con cualquiera de las funciones de pintura o cualquier cosa.

Cuando ejecuto este código, mi regreso vuelve como una imagen que se parece a mi imagen, excepto que hay tres copias, una con un tinte verde, una que se ve amarilla y otra con un tinte púrpura notable.

Parece que tal vez sería la imagen correcta si estos tres datos estuvieran ... ¿se superaron entre sí?

¿Fue útil?

Solución

Solo una suposición, pero por los colores (incorrectos) que mencionó, sospecho que el problema podría estar con su código de asignación/inicialización con respecto al char **rgbMapped variable. ¿Podría publicar este código?

Intentaré escribir un código de inicialización Posiblemente Bellow (?) Solo para darle una pista que puede ayudar (no he compilado el código, por lo tanto, me disculpo por cualquier error de sintaxis). Utilizo malloc () pero también puede usar el operador nuevo ().

// allocate a single buffer for all image pixels
unsigned char *imgbuf = malloc(3 * getWidth() * getHeight());

// allocate row pointers
unsigned char **rgbMapped = malloc(getHeight() * sizeof (unsigned char *)); 

// Initialize row pointers
for (int h=0; h < getHeight(); h++)
{
  *rgbMapped[h] = &imgbuf[h * 3 * getWidth()];
}

// ... do your processing

// Free the image buffer & row pointers
free(imgbuf);
imgbuf = NULL;
free(rgbMapped);
rgbMapped = NULL;

La parte importante es la inicialización de los punteros de la fila (¿olvidaste el *3?). Solo mi 2C.

Otros consejos

¿Estás contando por Stride? Cada línea de escaneo debe comenzar en un límite de 4 bytes. También puede no ser un formato de píxel lleno, por lo que cada píxel es 4 bytes no 3

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top