• Viernes 8 de Noviembre de 2024, 14:02

Autor Tema:  Fichero BMP  (Leído 2446 veces)

Luis garcia

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Fichero BMP
« en: Martes 2 de Junio de 2009, 19:16 »
0
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.

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Fichero BMP
« Respuesta #1 en: Martes 2 de Junio de 2009, 21:18 »
0
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...
No hay tonto más molesto que el ingenioso.

Luis garcia

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Fichero BMP
« Respuesta #2 en: Miércoles 3 de Junio de 2009, 15:52 »
0
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.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Fichero BMP
« Respuesta #3 en: Miércoles 3 de Junio de 2009, 15:53 »
0
Podes usar fseek.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Luis garcia

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Fichero BMP
« Respuesta #4 en: Miércoles 3 de Junio de 2009, 19:08 »
0
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.

Luis garcia

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Fichero BMP
« Respuesta #5 en: Sábado 6 de Junio de 2009, 00:43 »
0
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.

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Fichero BMP
« Respuesta #6 en: Sábado 6 de Junio de 2009, 15:38 »
0
fprintf(fich,"%u",vble_unsigned);
No hay tonto más molesto que el ingenioso.