Estoy tratando de leer los datos de los píxeles de un mapa de bits en una matriz de estructura (que contiene a R, G y B enteros, para los colores). Estoy usando un 12x12px imagen sólo para pruebas (porque creo que el bmp especificación dice que los datos de los píxeles se rellena con ceros al final de cada línea para hacer que la palabra-alineados. 12 px de ancho automáticamente palabra alineada.

Este es el código que estoy usando. el INFOHEADER y FILEHEADER se analiza a la perfección, y un 12×12 matriz 2D de IMAGEs im es creado. Sin embargo, la impresión de los datos RGB de cada píxel se imprime basura.

typedef struct __attribute__((__packed__)) {
    unsigned char  b;
    unsigned char  g;
    unsigned char  r;
} IMAGE;

int main(void) {
    FILEHEADER fh;
    INFOHEADER ih;
    FILE *img = fopen("pic.bmp", "rb");
    fread(&fh, sizeof(unsigned char), sizeof(FILEHEADER), img);
    fread(&ih, sizeof(unsigned char), sizeof(INFOHEADER), img);

    IMAGE im[ih.width][ih.height];
    fseek(img, fh.imageDataOffset, 0);
    int i, j;
    for (i = ih.height-1; i >= 0; i--) {
        for (j = 0; j < ih.width; j++) {
            fread(&im[i][j], sizeof(unsigned char), sizeof(IMAGE), img);
            printf("%x%x%x ", im[i][j].r, im[i][j].g, im[i][j].b);
        }
        printf("\n");
    }
    printf("w = %d, h = %d\n", ih.width, ih.height);
}

Sin embargo, para un 12x12px completamente blanco de mapa de bits, esto salidas:

ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff 
ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff 
ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff 
ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff ffffff 
000 ca800 ff574b 007f 001 000 b000 574bc9 07fff 44c40 ff8690 007f 
9077b0 7fff86 8000 574bca 07fff 0a00 ff7482 007f 4bc950 7fff57 2f00 86906d 
07fff 60a50 ff8690 007f 4bc9d0 7fff57 ee00 87418 000 c9300 ff574b 007f 
4bc8f0 7fff57 700 868b3c 07fff 400 000 000 820a0 7fff74 3000 574bc9 
07fff 6000 1877 000 0100 000 000 004 000 1000 000 000 
820a0 7fff74 000 0010 000 6000 1874 000 4bc8d0 7fff57 b300 868b31 
000 38b30 051f9 000 000 000 000 000 000 010 000 000 
745069 018 f700 ffffff 181a4 080 000 000 01f5 0140 000 000 

Nadie puede ver lo que estoy haciendo mal? Podría ser un problema de alineación?

Gracias

EDICIÓN:

Esta es una captura de pantalla de la parte inferior del archivo de mapa de bits. Parece ser 144 (12×12) píxeles blancos (resaltado). Los dos últimos ceros de relleno. Aún así no tiene sentido que mi programa no analizar este correctamente aunque.

Carga BMP datos de los píxeles en una matriz C

  • Va a cambiar la altura y el ancho en su lectura de bucle. No es el tema aquí (para una imagen cuadrada), pero es posible que desee corregir. Se puede verificar sizeof(IMAGEN) es de 3? También, usted puede abrir la imagen BMP en un hex viewer y comprobar que no haya 0 byte de relleno entre el rgb trillizos?
  • Sí sizeof(IMAGEN) es de 3. Y ver mi edición para el relleno
  • Has probado a utilizar un desempaquetado struct?
  • Sí, desempaquetado estructuras aún así no funciona
  • Por cierto, pensé que iba a ser «lleno» en lugar de «_ embalado _».
  • No quiero entrar demasiado off topic, pero stackoverflow.com/a/4306269/579132
  • Yo sólo probé a mí mismo, pero la lectura es buena, en mi caso, (linux g++ 64 bits)
  • Acabo de leer que algunos compiladores no apoyar la variable de tamaño de las matrices en la pila, que podría ser el problema?
  • Lo que está muy bien, ¿se pueden imprimir todos los 1s (F en hexadecimal en mi código)??
  • Compilar con g++ en mi sistema sigue dando los mismos resultados

InformationsquelleAutor Conor Taylor | 2013-07-31

1 Comentario

  1. 1

    Aceptar resulta que me salvó a mi en blanco bmp como de 8 bytes en lugar de 24 bits. 8bit utiliza una tabla de colores, y cada píxel se hace referencia a una entrada en la tabla de colores para obtener sus datos. 24 bits bmp utiliza 3 bytes por píxel, y cada byte representa un R, G y B de valor, por lo que no necesita una tabla de colores.

Dejar respuesta

Please enter your comment!
Please enter your name here