Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Mioshi en 14 Enero 2014, 19:10 pm



Título: [Ayuda] Abrir fichero de imagen en c
Publicado por: Mioshi en 14 Enero 2014, 19:10 pm
Hola comunidad, hoy me dejaron un proyecto en TC20. El proyecto se basa en abrir ficheros y modo grafico. Lo que me preocupa es la parte de abrir el fichero de una imagen, tengo entendido que solo se pueden abrir imagenes con extension .bmp pero no se como hacerlo. Si alguien me puede ayudar con un codigo de ejemplo se lo agradeceria mucho.

Espero su respuesta y muchas gracias de antemano.


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: vangodp en 14 Enero 2014, 19:42 pm
Si no te han dicho que librería usar puedes optar por una como SDL.
Y si le añades SDL_image si que puedes abrir cualquier formato.
Y ademas es relativamente fácil.
Descargas las librerías de SDL, añades al IDE y a la carpeta donde va el .exe añades una dll o según el tipo de imagen que vayas cargar(jpg, tga, bmp...) mas de una dll(una dll por cada tipo de imagen extra a parte de la bmp).
SDL trabaja con bmp, si quieres estos otros formatos necesitas una especie de extensión que te permite cargar los otros formatos.
No se si hay alguna librería mas a mano, SDL es como matar moscas a cañonazo no se XD
Es una librería multimedia, te sirve para hacer aplicaciones, videojuegos, sonidos, gestionar entrada salida, joystick, red todo.
cargar una imagen es fácil, mas difícil es configurar la librería pero tampoco es un bicho de 7 cabezas.
Si te interesa dímelo y te echo una mano.
 ::)




Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: Mioshi en 14 Enero 2014, 20:16 pm
hola, gracias por responder pero no entiendo mucho lo que me estas tratando de explicar, estoy empezando a programar en c y pues no se si me puedas ayudar con un ejemplo especifico

Código:
#include <alloc.h>
#include <conio.h>
#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>


typedef struct
{
  char Type[2];           /*Tipo de archivo. establecido en "BM".*/
  unsigned long Size;     /*Tamano en BYTES del archivo*/
  unsigned long Reserved;      /*Reservado. establecido en cero*/
  unsigned long OffSet;   /*Desplazamiento hacia datos*/
  unsigned long headsize; /*Tamaño de la cabecera del bitmap. establecido en 40.*/
  unsigned long Width;     /*Anchura en  pixeles.*/
  unsigned long Height;     /* Altura en pixeles.*/
  unsigned int  Planes;    /*Numero de Planos. establecido en 1.*/
  unsigned int  BitsPerPixel;       /*Numero de Bits por pixeles.*/
  unsigned long Compression;   /*Compresion. Usually establecido en 0.*/
  unsigned long SizeImage;  /*Tamano en BYTES del bitmap.*/
  unsigned long XPixelsPreMeter;     /*Pixeles Horizontales por metro.*/
  unsigned long YPixelsPreMeter;     /*Pixeles Verticales por metro.*/
  unsigned long ColorsUsed;   /*Numero de colores utilizados.*/
  unsigned long ColorsImportant;  /*Numero de colores "Importantes".*/
}BMP;

int muestraBMP(int x, int y, char* NomArchivo);
void main()
{
int color;
int gd , gm ;
gd = VGA ; gm = VGAHI;
clrscr();
initgraph(&gd,&gm,"C:\TC20\BIN");
muestraBMP(0,0,"pez.bmp"); /* Ingresa el nombre y direccion del archivo aqui */
getch();
closegraph();
}

int muestraBMP(int x, int y, char* NomArchivo)
{
    int b,a;
    BMP Obj;

    unsigned char* Datas;
    int in=0;
    unsigned char c=0;
    FILE * fp;

    fp = fopen(NomArchivo,"rb");
    if(!fp){
    printf("Error : No se puede abrir el archivo ...");
getch();
    exit(0);
    }

    fread(&Obj, sizeof(Obj), 1, fp);
    if(Obj.BitsPerPixel!=4)  /* Este NO es un bmp de 16 colores que podamos leer*/
    {
     fclose(fp);
     printf("Error : Formato de archivo no soportado...");
getch();
     exit(0);
    };
    fseek(fp,Obj.OffSet,SEEK_SET);
    Datas=(unsigned char*) calloc(Obj.Width/2+1, sizeof(unsigned char));
    for(b=Obj.Height;b>=0;b--)
    {
     fread(Datas, sizeof(unsigned char), Obj.Width/2, fp);
     c=0;
     in=0;
     for(a=0;a<=Obj.Width;a+=2)
     {
c = (Datas[in] | 0xF0) & 0x0F;
         putpixel(a+1+x,b+y,c);
         c = (Datas[in] | 0x00) >>4;
         putpixel(a+x,b+y,c);
         in++;
     }
    }
    free (Datas);
    fclose(fp);
    return 1;
}

Este es un codigo que me paso una amiga, pero no me corre muy bien, no se que estoy haciendo mal


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: vangodp en 14 Enero 2014, 20:27 pm
¿Que IDE usas?
¿Windos?


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: Mioshi en 14 Enero 2014, 20:28 pm
sip window


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: vangodp en 14 Enero 2014, 20:29 pm
Que compilador usas?
Yo uso codeblocks y me esta tirando errores por que no incluye estas librerias de graficos


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: Mioshi en 14 Enero 2014, 20:30 pm
TC20 o turbo c 2.0


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: vangodp en 14 Enero 2014, 20:30 pm
Basicamente estas 2 no las encuentra

#include <alloc.h>
#include <graphics.h>


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: vangodp en 14 Enero 2014, 20:31 pm
No te voy a poder ayudar.
No tengo turbo c :(


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: vangodp en 14 Enero 2014, 20:33 pm
por lo que veo la imagen debe estar junto en la carpeta y llamar la imagen de pez.bmp XD
Si te tira errores pon el aviso aqui a ver si averiguamos que le pasa



Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: x64core en 14 Enero 2014, 20:49 pm
@Mioshi: Para abrir un archivo con las funciones fopen, etc no tiene nada que ver el tipo de archivo. y ya que lo que necesitas es un ejemplo de como leer archivos y saber como usar las funciones aqui esta un pequeño tutorial bastante claro de como usarlas:
http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Manejo_de_archivos

Por cierto, @vangodp evita publicar tanto post en un tema y más si son totalmente inutiles y ni siquiera se sabe lo que se esta hablando.


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: vangodp en 14 Enero 2014, 21:06 pm
Has probado compilar O Gran X64 ¬¬
Ya vaya ayuda has prestado tu.
Ya le has resuelto la vida con el enlace vaya ayuda.


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: x64core en 14 Enero 2014, 21:13 pm
Has probado compilar O Gran X64 ¬¬
Ya vaya ayuda has prestado tu.
Ya le has resuelto la vida con el enlace vaya ayuda.

En realidad desde un princio el usuario buscaba ayuda de como abrir archivos y ejemplos. En el enlace hay muy simple ejemplo y explicación.
Creo que el que deberia aprender a leer bien los temas eres tu y evitar de publicar tanta basura.


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: vangodp en 14 Enero 2014, 21:20 pm
Que ejemplo?
Lo ha puesto en su primer post?
¿Donde?
No jodas compañero.
Aprende a decir las cosas en condiciones que te va mejor.
Como mucho puede que somos 2 desentendidos.
Si explicas a la gente así vas de culo.


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: leosansan en 14 Enero 2014, 21:23 pm
.....................................
Por cierto, @vangodp evita publicar tanto post en un tema y más si son totalmente inutiles y ni siquiera se sabe lo que se esta hablando.


* Lo de los archivos prefiero pasarlo por alto.  ;)

* Lo de tanto post te doy la razón en parte. Siempre se puede reeditar el post anterior si no hay nuevas contestaciones. A no ser que se vaya a hacer una aportación nueva y/o distinta.

* Si no sabe de que habla y tú si, aclarase lo y así ayudas. Porque la culpa nace del post original:


Hola comunidad, hoy me dejaron un proyecto en TC20. El proyecto se basa en abrir ficheros y modo grafico..
 ....................

* Habla de modo gráfico y eso es lo que ha llevado a confusión al amigo vangodp, al no haberse fijado en lo que dice anteriormente que trabaja, si se puede llamar así al uso de ese programa, con Turbo C y que éste incluye de forma nativa modo gráfico, por lo que no le es necesario el uso de librerías externas, como se imaginaba vangodp. Al menos intento alguna solución a lo que entendió y eso siempre es de agradecer. :rolleyes:

Como ves, cuesta poco aclara el malentendido y se evitan malos rolllos.

Y esto que te expongo es en plan de buen rollito. ;) ;) ;)



¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)

.....................................
Creo que el que deberia aprender a leer bien los temas eres tu y evitar de publicar tanta basura.
.........................................................

P.D: Habría que repasar tus post a ver donde encontramos más basura. Creo que te has pasado un pelín. :silbar: :silbar: :silbar:


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: vangodp en 14 Enero 2014, 21:27 pm
Pues samsam, tu tienes clase.
Desconozco el borland compañero.
Pero que la gente venga a decir sandeces que lo que pones es inutil y tal tal tal.
Que se de un paceito ya te digo.
Me di cuenta lo de la librería que no podía compilar.
Joe que uno no se puede equivocar aquí que te comen a bocal.
Si me dice que no ponga tanto post hasta te le doy la razón.
As veces soy pesado con tal de intentar ayudar la gente.
Pero ya no es la primera vez que me vienen atacar en este foro.
¿Donde esta el compañerismo aquí?
Ya me chupe 2 ataques de compañeros aquí, y este es el 3º.


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: amchacon en 14 Enero 2014, 21:48 pm
tengo entendido que solo se pueden abrir imagenes con extension .bmp
El lenguaje no te limita a nada, tú puedes abrir cualquier archivo que se te ocurra siempre que sepas como funciona. Lo que pasa esque el BMP tiene un funcionamiento "relativamente" sencillo.

Te pongo comentarios en el código, pero sin saber como funciona un BMP te vas a liar:
Código
  1. int muestraBMP(int x, int y, char* NomArchivo)
  2. {
  3.    int b,a;
  4.    BMP Obj; // una estructura que contiene todos los datos de la cabecera
  5.  
  6.    unsigned char* Datas;
  7.    int in=0;
  8.    unsigned char c=0;
  9.    FILE * fp;
  10.  
  11.    fp = fopen(NomArchivo,"rb"); // abrimos el archvio en cuestion
  12.  
  13.    // si no se encuentra, mostramos un mensaje de error y abortamos el progama
  14.  
  15.    if(!fp){    
  16.    printf("Error : No se puede abrir el archivo ...");
  17. getch();
  18.    exit(0);
  19.    }
  20.  
  21.    // leemos la "cabecera" del BMP
  22.  
  23.    fread(&Obj, sizeof(Obj), 1, fp);
  24.  
  25.    /* Este código está preparado para leer imagenes en 16 colores. Cualquier imagen que quieras
  26.     usar de prueba debe guardarse en esos colores.
  27.    
  28.     El if siguiente comprueba esto y muestra un mensaje de error en el caso contrario */
  29.  
  30.    if(Obj.BitsPerPixel!=4)  /* Este NO es un bmp de 16 colores que podamos leer*/
  31.    {
  32.     fclose(fp);
  33.     printf("Error : Formato de archivo no soportado...");
  34. getch();
  35.     exit(0);
  36.    };
  37.  
  38.    /* Unos de los parametros de la firma BMP indica la posición del archivo donde comienzan los datos de imagen, se coge ese parametro y se avanza a esa posición */
  39.  
  40.    fseek(fp,Obj.OffSet,SEEK_SET);
  41.  
  42.    // Se reservan los suficientes datos para una fila de la imagen
  43.  
  44.    Datas=(unsigned char*) calloc(Obj.Width/2+1, sizeof(unsigned char));
  45.  
  46.   // Guardamos los datos de la imagen
  47.  
  48.    for(b=Obj.Height;b>=0;b--)
  49.    {
  50.     fread(Datas, sizeof(unsigned char), Obj.Width/2, fp); // Leemos una fila de la imagen
  51.     c=0;
  52.     in=0;
  53.     for(a=0;a<=Obj.Width;a+=2)
  54.     {
  55. c = (Datas[in] | 0xF0) & 0x0F; //cogemos el dato relativo al primer pixel
  56.         putpixel(a+1+x,b+y,c); // pintamos un pixel
  57.         c = (Datas[in] | 0x00) >>4; // cogemos el dato relativo al segundo pixel
  58.         putpixel(a+x,b+y,c); // pintamos el otro pixel (cada byte = 2 pixeles).
  59.         in++;
  60.     }
  61.    }
  62.  
  63.    // liberamos memoria, cerramos el archivo y devolvemos un 1 para indicar que todo fue correcto
  64.  
  65.    free (Datas);
  66.    fclose(fp);
  67.    return 1;
  68. }

Decirte además que Turbo C está muerto desde hace 10 años y que no deberías focalizar tu aprendizaje en esas cosas.


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: x64core en 14 Enero 2014, 21:50 pm
Que ejemplo?
Lo ha puesto en su primer post?
¿Donde?
No jodas compañero.
Aprende a decir las cosas en condiciones que te va mejor.
Como mucho puede que somos 2 desentendidos.
Si explicas a la gente así vas de culo.

Bueno entonces no es problema mio si nisiquiera puedes mirar los codigos fuentes que hay en el enlace que publique. Aquí el unico desentendido eres tu, quien ni siquiera sabe leer un tema.


* Lo de los archivos prefiero pasarlo por alto.  ;)
Piensas explicar?


* Si no sabe de que habla y tú si, aclarase lo y así ayudas. Porque la culpa nace del post original:

El post original no tiene la culpa, realmente el post original fue claro, necesita ayuda de como abrir archivos y ejemplos. más disputas sobre algo especifico vendrian.

P.D: Habría que repasar tus post a ver donde encontramos más basura. Creo que te has pasado un pelín. :silbar: :silbar: :silbar:
Pues si nos la vamos a medir apuesto a que tengo menos basura que los dos.




Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: vangodp en 14 Enero 2014, 21:54 pm
Y sigue.
Bua ahí te quedas 64.
Eres peor que un niño. :P
Por cierto amchacom. 16 colores es lo mismo que 16 bits o como va eso?   :huh:

PD:Ya lo encontré en un post tuyo creo al cual le destripas un BMP :D
4bits=16 colores.

Es bastante baja resolución ¿no?


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: x64core en 14 Enero 2014, 22:07 pm
Y sigue.
Bua ahí te quedas 64.
Eres peor que un niño. :P
Creo que algo más estupido en el dia no pude haber leido.


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: vangodp en 14 Enero 2014, 22:14 pm
Solo confirmas lo antes dicho.


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: amchacon en 14 Enero 2014, 22:22 pm
Por cierto amchacom. 16 colores es lo mismo que 16 bits o como va eso?   :huh:

PD:Ya lo encontré en un post tuyo creo al cual le destripas un BMP :D
4bits=16 colores.

Es bastante baja resolución ¿no?
No es baja resolución (eso sería una imagen pequeñita) simplemente tiene pocos colores.

Para una foto no te vale, pero para un dibujo tonto te puede valer y era una forma de ahorrar espacio.

PD: ¿Era este link el que mirastes?
http://www.elotrolado.net/hilo_imagenes-bmp-destripandolas-a-fondo_1807836

En las últimas respuestas, un usuario posteó un enlace a una clase BMP hecha en C++. Es interesante de ver ;)


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: vangodp en 14 Enero 2014, 22:57 pm
¡SI! :D
Esta muy interesante el análisis del BMP, la vi otro dia y me la guarde.
Me viene de perla saber como funciona.
Como estoy iniciando en SDL cualquier ayuda sobre el tema es bienvenido.

Que bueno la classe  tnks ;D
La tengo que mirar con tiempo para entenderla bien. Guardada junto con el post. ^^


Título: Re: [Ayuda] Abrir fichero de imagen en c
Publicado por: jackleo1995 en 14 Enero 2015, 08:21 am
nesecito que alguien me explique como cargar una imagen en c con doxbox