SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: Escalona en Jueves 14 de Diciembre de 2006, 11:24

Título: Obtener El Chunk De Datos De Una Imagen.
Publicado por: Escalona en Jueves 14 de Diciembre de 2006, 11:24
Hola me gustaria obtener el chunk de datos de una imagen, que supongo que sera lo mismo que para cualquier tipo de archivo.
Por lo que he visto por ahi tengo ke abrir el archivo en modo binario e ir guardandolo en alguna variable. A ver si podeis guiarme , gracias.


Edito:


Estoy intentandolo de la siguiente manera pero no me deja me lanza error.

Código: Text
  1.  
  2. ifstream ifs;
  3. ifs.open("c:\\bt.gif",ios::binary);
  4. char* buffer;
  5. int size;
  6.  
  7. //obtengo el tamaño del fichero
  8. ifs.seekg(0, ios::end);
  9. size = ifs.tellg();
  10. ifs.seekg(0, ios::beg);
  11.  
  12.  
  13. //lo asigno a una variable para guardar el chunk
  14. char* img;  
  15. ifs.getline(img, size);
  16.  
  17.  

así me dice "Run-Time Check Failure #3 - The variable 'img' is being used without being defined."

si le pongo un tamaño fijo a img por ejemplo asi:


Código: Text
  1.  
  2. ifstream ifs;
  3. ifs.open("c:\\bt.gif",ios::binary);
  4. char* buffer;
  5. int size;
  6.  
  7. //obtengo el tamaño del fichero
  8. ifs.seekg(0, ios::end);
  9. size = ifs.tellg();
  10. ifs.seekg(0, ios::beg);
  11.  
  12.  
  13. //lo asigno a una variable para guardar el chunk
  14. char img[1105];  
  15. ifs.getline(img, size); //donde size vale 1105
  16.  
  17.  

no me lanza el error, pero no me guarda bien el chunk de datos de la imagen, lo ke me guarda en la variable no corresponde a la imagen.
Título: Re: Obtener El Chunk De Datos De Una Imagen.
Publicado por: _.B._ en Jueves 14 de Diciembre de 2006, 13:57
Sip, debes abrir las imágenes como archivos binarios, y leer de todo un encabezado, o de variable en variable (ancho, largo, profundidad, etc.).
Ahora, ¿es una imágen BMP o JPEG? Sus encabezados son distintos.
Dale un googlazo para que encuentres el encabezado que buscas, y luego un fread te debería servir.
Cualquier cosa vuelve a preguntar, que seguro alguien te responde.

¡A programar! :comp:
Título: Re: Obtener El Chunk De Datos De Una Imagen.
Publicado por: Escalona en Jueves 14 de Diciembre de 2006, 14:02
He editado el primer post, a ver que encuentro voy a buscar.
Título: Re: Obtener El Chunk De Datos De Una Imagen.
Publicado por: Eternal Idol en Jueves 14 de Diciembre de 2006, 16:50
Con memoria dinamica:

Código: Text
  1.  
  2. char *img = (char*)malloc(size);
  3. ifs.getline(img, size);
  4. //usar
  5. free(img);
  6.  
  7.  
Título: Re: Obtener El Chunk De Datos De Una Imagen.
Publicado por: Escalona en Viernes 15 de Diciembre de 2006, 11:06
Bien, muchas gracias por las aclaraciones, ahora ya se que necesito usar malloc para poder usar la variable img, bien hasta ahi me funciona todo, ahora estoy recorriendo el fichero *.jpg abierto en modo binario para guardar su contenido en una variable  de la siguiente forma:

Código: Text
  1.  
  2.  ifs.open("c:\\bt.jpg",ios::out | ios::binary);
  3.  
  4.  ifs.seekg(0, ios::end);
  5.  size = ifs.tellg();
  6.  ifs.seekg(0, ios::beg);
  7.  
  8. char* img = (char*)malloc(size);
  9.  com=0;
  10.    do {
  11.     ifs.read(buffer, 2048);
  12.     bytesLeidos = ifs.gcount();
  13.     if (com==0){
  14.       strcpy(img,buffer);
  15.     }else{
  16.       strcat(img,buffer);
  17.     }
  18.     com++;
  19.     } while(bytesLeidos > 0);
  20.  
  21.  
  22.  

Parecía que funcionaba bien, el problema es que llegados a un punto ( cuando el bucle da 3 o 4 vueltas, la variable img inexplicablemente se me vacía, y ya no sigue concatenando al estar vacía. ¿Alguien sabe a que puede deberse???
Título: Re: Obtener El Chunk De Datos De Una Imagen.
Publicado por: Eternal Idol en Viernes 15 de Diciembre de 2006, 11:11
¿str*? Esas son funciones de cadena, para copiar datos binarios usa memcpy.
Título: Re: Obtener El Chunk De Datos De Una Imagen.
Publicado por: Escalona en Viernes 15 de Diciembre de 2006, 11:44
Ajá gracias, ya estoy copiando con memcpy, pero para concatenar valores binarios como puedo hacerlo?
Tal vez me estoy yendo por las ramas pero esque no he encontrado la forma de cargar el contenido completo del fichero en binario dentro de una variable, de ahí que esté intentandolo poco a poco en bloques de 2048 bytes.
Título: Re: Obtener El Chunk De Datos De Una Imagen.
Publicado por: Eternal Idol en Viernes 15 de Diciembre de 2006, 12:34
Tenes que hacer que el primer parametro de memcpy (el destino) no sea siempre la direccion de comienzo de la memoria reservada (img en este caso) sino esa direccion mas lo ya leido.

Yo haria asi (a grosso modo):

Código: Text
  1.  
  2. char *img = (char*)malloc(size);
  3. char *img_dst = img;
  4.  
  5.  

Entonces cuando copias:
Código: Text
  1.  
  2. memcpy(img_dst, buffer, 2048);
  3. img_dst += 2048;
  4.  
  5.  
Título: Re: Obtener El Chunk De Datos De Una Imagen.
Publicado por: Escalona en Viernes 15 de Diciembre de 2006, 14:17
Solucionado

Gracias por todas vuestras respuestas pongo el codigo para que veais como al final lo he conseguido, primero el metodo getline no me servia (devuelve una cadena hasta que ve un retorno de linea de manera que no me daba el binario completo) he usado fread, y segundo no hacia bien el malloc, no alocaba la memoria total que necesitaba, bueno asi lo he hecho y me ha funcionado correctamente:

Código: Text
  1. char * m=(char*)malloc(size*sizeof(char));  
  2. if (m==NULL) return 3;  //error
  3.  
  4. fread(m,sizeof(char),size,f); //vuelca el fich a memoria.
  5.  

Al final mucho más sencillo que todo lo que estaba haciendo como me temia.
Gracias a todos.
Título: Re: Obtener El Chunk De Datos De Una Imagen.
Publicado por: Eternal Idol en Viernes 15 de Diciembre de 2006, 15:57
Ojo, eso esta bien pero si tenes un archivo de 3GB es mejor hacerlo por partes ...
Título: Re: Obtener El Chunk De Datos De Una Imagen.
Publicado por: Escalona en Viernes 15 de Diciembre de 2006, 21:32
ejeje Sí, lo pensé, el programa slo va a trabajar con archivos de imagenes pequeñas, por lo que no debería tener ningún problema.