• Domingo 28 de Abril de 2024, 07:21

Autor Tema:  Obtener El Chunk De Datos De Una Imagen.  (Leído 3147 veces)

Escalona

  • Miembro activo
  • **
  • Mensajes: 63
    • Ver Perfil
Obtener El Chunk De Datos De Una Imagen.
« en: Jueves 14 de Diciembre de 2006, 11:24 »
0
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.

_.B._

  • Miembro activo
  • **
  • Mensajes: 88
    • Ver Perfil
Re: Obtener El Chunk De Datos De Una Imagen.
« Respuesta #1 en: Jueves 14 de Diciembre de 2006, 13:57 »
0
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:
¡Olmo, dame peras!
www.BernardoLG.net

Escalona

  • Miembro activo
  • **
  • Mensajes: 63
    • Ver Perfil
Re: Obtener El Chunk De Datos De Una Imagen.
« Respuesta #2 en: Jueves 14 de Diciembre de 2006, 14:02 »
0
He editado el primer post, a ver que encuentro voy a buscar.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Obtener El Chunk De Datos De Una Imagen.
« Respuesta #3 en: Jueves 14 de Diciembre de 2006, 16:50 »
0
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.  

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.

Escalona

  • Miembro activo
  • **
  • Mensajes: 63
    • Ver Perfil
Re: Obtener El Chunk De Datos De Una Imagen.
« Respuesta #4 en: Viernes 15 de Diciembre de 2006, 11:06 »
0
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???

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Obtener El Chunk De Datos De Una Imagen.
« Respuesta #5 en: Viernes 15 de Diciembre de 2006, 11:11 »
0
¿str*? Esas son funciones de cadena, para copiar datos binarios usa memcpy.

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.

Escalona

  • Miembro activo
  • **
  • Mensajes: 63
    • Ver Perfil
Re: Obtener El Chunk De Datos De Una Imagen.
« Respuesta #6 en: Viernes 15 de Diciembre de 2006, 11:44 »
0
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.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Obtener El Chunk De Datos De Una Imagen.
« Respuesta #7 en: Viernes 15 de Diciembre de 2006, 12:34 »
0
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.  

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.

Escalona

  • Miembro activo
  • **
  • Mensajes: 63
    • Ver Perfil
Re: Obtener El Chunk De Datos De Una Imagen.
« Respuesta #8 en: Viernes 15 de Diciembre de 2006, 14:17 »
0
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.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Obtener El Chunk De Datos De Una Imagen.
« Respuesta #9 en: Viernes 15 de Diciembre de 2006, 15:57 »
0
Ojo, eso esta bien pero si tenes un archivo de 3GB es mejor hacerlo por partes ...

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.

Escalona

  • Miembro activo
  • **
  • Mensajes: 63
    • Ver Perfil
Re: Obtener El Chunk De Datos De Una Imagen.
« Respuesta #10 en: Viernes 15 de Diciembre de 2006, 21:32 »
0
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.