SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: Luis garcia en Martes 2 de Junio de 2009, 19:16

Título: Fichero BMP
Publicado por: Luis garcia en Martes 2 de Junio de 2009, 19:16
Hola a todos:

Necesito vuestra ayuda porque me estoy volviendo loco con un tema para leer la cabecera de un archivo BMP.

Tengo que leer un archivo BMP 54 bytes de cabecera y el resto de datos.

Debo hacerlo inexcusablemete con la sentencia fscanf.

Los dos primeros caracteres los leo perfectamente.

El problema es cuando trato de leer el resto que segun he leido son:

Primero una cabecera de 14 bytes con la información del fichero. Sus campos son:
• char magic_number1; //Tiene que valer 'B'
• char magic_number2; //Tiene que valer 'M'
• int file_size; //El tamaño del fichero que será 54 + el tamaño de la imagen
• short int reserved1; //No nos importa su contenido
• short int reserved2; //No nos importa su contenido
• int bitmap_start; //Tiene que valer 54
• A continuación una cabecera de 40 bytes con la información de la imagen. Sus campos son:• int cabecera_size; //Tiene que valer 40
• int width; //Ancho de la imagen
• int height; //Alto de la imagen
• short int color_planes; //No nos importa su contenido
• short int bits_per_pixel; //Tiene que valer 24
• int compression; //Tiene que valer 0
• int image_size; //El tamaño de la imagen que será alto * ancho * 3
• int h_res; //No nos importa su contenido
• int v_res; //No nos importa su contenido
• int n_colors; //Tiene que valer 0
• int n_important_colors; //Tiene que valer 0
• Finalmente, los datos de la imagen dispuestos de la siguiente forma. Cada píxel de la imagen
tiene un color que se representa por sus componentes rojo, verde y azul.

Lo que tengo que hacer es introducir los datos de los pixels en una matriz de [ancho , alto*3( Bytes de cada color RGB)]
modificar esos bytes y grabarlos de nuevo en el fichero, con idéntica cabecera.

Me he quedado encajado en la lectura con el fscanf.

Adjunto el código donde me clavo.

#include <stdio.h>
#include <stdlib.h>
#define MAXTEXT 50
int main ()
{
       char nombre[MAXTEXT];
       FILE *fich;
        char magic_number1;
        int width;
        int height;




     do{
        printf("Introduzca el nombre del fichero origen:");
        scanf("%19[^n]s", nombre);
        getchar();
        fich = fopen(nombre,"r"); //abro el fichero para leer
        if(fich==NULL)
           printf("Error abriendo el fichero origenn");
    } while (fich==NULL);


        fscanf(fich,"%c",&magic_number1);
        printf("%c",magic_number1);/* para ver el resultado*/
        fscanf(fich,"%4c",&width);
        printf("%4c",width);/*para ver resultado*/
        fscanf(fich,"%4c",&height);
        printf("%4c",height);/*esto no me escribe el tamaño del fichero*/

Os agradecería me indicaseis como puedo leere los caracteres de las cabeceras y los datos de los pixeles.

Aprovecho la ocasión para enviaros un cordial saludo.
Título: Re: Fichero BMP
Publicado por: carmamezo en Martes 2 de Junio de 2009, 21:18
prueba a usar el fscanf() correctamente según el tipo de datos que quieras leer:
un char: fscanf(fich,"%c",&tipo_char);
un short/int: fscanf(fich,"%d",&tipo_short_int);
un float: fscanf(fich,"%f",&tipo_float);

vamos que uses el tipo adecuado a la variable que quieres sacar...
Título: Re: Fichero BMP
Publicado por: Luis garcia en Miércoles 3 de Junio de 2009, 15:52
Cita de: "carmamezo"
prueba a usar el fscanf() correctamente según el tipo de datos que quieras leer:
un char: fscanf(fich,"%c",&tipo_char);
un short/int: fscanf(fich,"%d",&tipo_short_int);
un float: fscanf(fich,"%f",&tipo_float);

vamos que uses el tipo adecuado a la variable que quieres sacar...

Muchas gracias.

Esta tarde lo probaré, aunque, aprovechando que el pisuerga pasa por Valladolid, ¿sabeis si hay alguna manera de posicionarse en un Byte determinado del fichero? ya que solo me hacen falta el ancho y alto de la matriz de pixels.

Os agradezco de antemano la atención prestada.

Un saludo.
Título: Re: Fichero BMP
Publicado por: Eternal Idol en Miércoles 3 de Junio de 2009, 15:53
Podes usar fseek (http://www.cplusplus.com/reference/clibrary/cstdio/fseek/).
Título: Re: Fichero BMP
Publicado por: Luis garcia en Miércoles 3 de Junio de 2009, 19:08
Gracias Eternal Idol, pero he de usar fscanf, tambien hubiese sido mas facil usar fget() o incluso hacerlo en C++, pero el reto está en hacerlo con fscanf(), en fin, marrones que le meten a uno.

repito, muchas gracias, sigo trbajando en ello, ya os contaré

Un cordial saludo.
Título: Re: Fichero BMP
Publicado por: Luis garcia en Sábado 6 de Junio de 2009, 00:43
Buenas noches:

Necesitaria que me ayudaseis con el descriptor para grabar en un fichero un unsigned char,

he probado con el %c, %d, y no me graba nada en el fichero.

¿alguna opcion?


gracias.

Un saludo.
Título: Re: Fichero BMP
Publicado por: carmamezo en Sábado 6 de Junio de 2009, 15:38
fprintf(fich,"%u",vble_unsigned);