2009-12-28 23 views

Respuesta

7

La manera más fácil sería encontrar una buena biblioteca de manipulación de imágenes para su plataforma elegida y usarla.

La manera más difícil sería abrir el archivo y realmente interpretar los datos binarios dentro. Para hacer eso necesitarás el BMP File Specification. Recomiendo probar el camino fácil primero.

6

Necesita estudiar el formato de archivo BMP. Es más fácil leer archivos BMP sin comprimir de 24 bits. Solo contienen un encabezado al principio y valores RGB de cada píxel.

Para comenzar, verifique el ejemplo de la imagen de mapa de bits 2x2 en http://en.wikipedia.org/wiki/BMP_file_format. Sigue los pasos a continuación.

  1. Cree la imagen 2x2 BMP que se muestra en la Wikipedia.
  2. Abra el archivo en modo binario con su programa C.
  3. Buscar en la posición de bytes 54.
  4. Lea 3 bytes.

Los bytes serían 0, 0 y 255 respectivamente. (No estoy seguro de si el orden es RGB. Lo he hecho hace mucho tiempo y creo que el orden no es RGB. Simplemente verifique esto.)

¡Tan simple como eso! Estudie el encabezado del BMP para comprender más sobre el formato.

10

Nota: puede que necesite tomar un byte extra para los valores alfa si su BMP tiene un canal alfa. En ese caso, la imagen sería image[pixelcount][4], y agregaría otra línea getc(streamIn) para contener ese cuarto índice. Mi BMP resultó no necesitar eso.

// super-simplified BMP read algorithm to pull out RGB data 
// read image for coloring scheme 
int image[1024][3]; // first number here is 1024 pixels in my image, 3 is for RGB values 
FILE *streamIn; 
streamIn = fopen("./mybitmap.bmp", "r"); 
if (streamIn == (FILE *)0){ 
    printf("File opening error ocurred. Exiting program.\n"); 
    exit(0); 
} 

int byte; 
int count = 0; 
for(i=0;i<54;i++) byte = getc(streamIn); // strip out BMP header 

for(i=0;i<1024;i++){ // foreach pixel 
    image[i][2] = getc(streamIn); // use BMP 24bit with no alpha channel 
    image[i][1] = getc(streamIn); // BMP uses BGR but we want RGB, grab byte-by-byte 
    image[i][0] = getc(streamIn); // reverse-order array indexing fixes RGB issue... 
    printf("pixel %d : [%d,%d,%d]\n",i+1,image[i][0],image[i][1],image[i][2]); 
} 

fclose(streamIn); 

~ Locutus

+0

¿No hay un trozo de cabecera que necesita para conseguir más allá antes de llegar a los datos de imagen? –

+1

@Anon ¿Qué pasa si mi archivo es jpeg? – Kraken

Cuestiones relacionadas