Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Almacenamiento de imágenes en un archivo

Estas en el tema de Almacenamiento de imágenes en un archivo en el foro de Visual Basic clásico en Foros del Web. Hola a todos. Soy un usuario bastante novato de Visual Basic y necesito un poco de ayuda. Me gustaría saber como hacer para almacenar imágenes ...
  #1 (permalink)  
Antiguo 06/06/2005, 18:00
 
Fecha de Ingreso: junio-2005
Mensajes: 37
Antigüedad: 18 años, 10 meses
Puntos: 0
Pregunta Almacenamiento de imágenes en un archivo

Hola a todos. Soy un usuario bastante novato de Visual Basic y necesito un poco de ayuda.
Me gustaría saber como hacer para almacenar imágenes (jpg) en un archivo externo al programa, al que se pueda recurrir y "traer" la imágen, ya que no quiero que las imágenes estén disponibles para un "libre acceso a ellas" (esto no tiene relación con internet, por las dudas).He buscado pero no he conseguido nada.
Desde ya muchas gracias.
  #2 (permalink)  
Antiguo 07/06/2005, 00:26
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Busca información sobre archivos de recursos. VB trae un editor de recursos bastate cutre, pero te puede servir para lo que deseas. Sin embargo, cualquiera podrá tomar tus imágenes si puede verlas ¿no crees?
  #3 (permalink)  
Antiguo 07/06/2005, 06:08
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por Beakdan
Busca información sobre archivos de recursos. VB trae un editor de recursos bastate cutre, pero te puede servir para lo que deseas. Sin embargo, cualquiera podrá tomar tus imágenes si puede verlas ¿no crees?
No tiene por qué... Si se inventa un algoritmo, es bastante difícil que alguien consiga las imágenes, y no creo que la aplicación sea tan importante como para hacerlo. En cualquier caso si las va a mostrar, es evidente que una captra o similar...

Yo en cambio simplemente haría un pequeño esquema de ficheros para guardar datos todos juntos y encriptados en vez de un archivo de recursos fácilmente manipulable.
  #4 (permalink)  
Antiguo 07/06/2005, 11:20
 
Fecha de Ingreso: junio-2005
Mensajes: 37
Antigüedad: 18 años, 10 meses
Puntos: 0
Yo lo único que quiero saber es como hacer para almacenar muchas imágenes en un archivo y luego recurrir a ellas (probé con los archivos de recursos pero solo admiten bmps). El programa que estoy haciendo es un simple rompecabezas, y no quiero que la imágen se encuentre, como dije al libre acceso, pero después "de armada", no importa que el usuario la vea. Si alguien puede decirme como hacer, lo agradecería.
Muchas gracias.
  #5 (permalink)  
Antiguo 07/06/2005, 11:52
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Pregunta

Cita:
Iniciado por Augusto1987
Yo lo único que quiero saber es como hacer para almacenar muchas imágenes en un archivo y luego recurrir a ellas (probé con los archivos de recursos pero solo admiten bmps). El programa que estoy haciendo es un simple rompecabezas, y no quiero que la imágen se encuentre, como dije al libre acceso, pero después "de armada", no importa que el usuario la vea. Si alguien puede decirme como hacer, lo agradecería.
Muchas gracias.
¿Rompecabezas?
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #6 (permalink)  
Antiguo 07/06/2005, 12:54
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por Augusto1987
Yo lo único que quiero saber es como hacer para almacenar muchas imágenes en un archivo y luego recurrir a ellas (probé con los archivos de recursos pero solo admiten bmps). El programa que estoy haciendo es un simple rompecabezas, y no quiero que la imágen se encuentre, como dije al libre acceso, pero después "de armada", no importa que el usuario la vea. Si alguien puede decirme como hacer, lo agradecería.
Muchas gracias.
Puedes hacer, como he dicho, un archivo que contenga datos encriptados. Ejemplo de un archivo:

- El encabezado. Iría la información concerniente al archivo, versión, programa, fecha y el lugar donde empiezan los datos
- Tabla de datos: Contendrá una lista, en cada elemento:
----- Símbolo/nombre de los datos
----- Offset final
- Los datos todos seguidos, encriptados o no

Entonces, deberás hacerte una función que lea/guarde este archivo.

Ejemplo del archivo:

Código:
0000 50 52 4F 47 52 41 4D 41 00 00 00 00 00 00 00 00 PROGRAMA........
0010 00 00 00 00 01 01 07 06 05 00 00 00 38 44 41 54 ............8DAT
0020 4F 31 00 00 00 00 00 00 00 63 44 41 54 4F 32 00 O1.......cDATO2.
0030 00 00 00 00 00 00 00 8F 45 73 74 65 20 65 73 20 ........Este es 
0040 65 6C 20 70 72 69 6D 65 72 20 64 61 74 6F 20 71 el primer dato q
0050 75 65 20 6C 6C 65 67 61 20 68 61 73 74 61 20 61 ue llega hasta a
0060 71 75 69 45 73 74 65 20 65 73 20 65 6C 20 73 65 quiEste es el se
0070 67 75 6E 64 6F 20 64 61 74 6F 20 71 75 65 20 6C gundo dato que l
0080 6C 65 67 61 20 68 61 73 74 61 20 61 71 75 69    lega hasta aqui
Para leerlo, lees el encabezado. Como puedes ver, lleva el título, la versión (01 01), la fecha (07 06 05), el comienzo de los datos (38). Después lees la tabla de datos buscando la que necesitas. Ejemplo, DATO1. Al lado de DATO1 aparece el offset (00 00 00 63), o sea 63. Como es el primer símbolo, comienzas desde 38 hasta 63 y ahí tienes tus datos. Si no fuera el primero, coges el offset del anterior dato como comienzo en vez de 38.

Como ves hay espacio que sobra para meter símbolos o el nombre del programa más grande. Todos deben ser iguales.
  #7 (permalink)  
Antiguo 07/06/2005, 13:52
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Pues si ese es el caso, y para seguir con lo "estándar", sería mejor definir un archivo con RIFF, y para realizar operaciones sobre el, las funciones mmio* de la librería winmm de la API. Codificados o no los datos, te será útil.
Y por cierto, un archivo de recursos admite cualquier clase de archivos. VB te los pondrá como "custom". Usando el compilador de recursos que seguramente tendrás en tu PC (rc.exe) puedes definir los identificadores que desees para los distintos tipos de archivo que se te ocurra incluir.
  #8 (permalink)  
Antiguo 07/06/2005, 13:55
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Si lo que quieres hacer es realmente un RompeCabezas por qué simplemente no guardas una sola imagen y luego recortas según sea necesario dentro de tu programa...
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #9 (permalink)  
Antiguo 07/06/2005, 15:37
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por David el Grande
Si lo que quieres hacer es realmente un RompeCabezas por qué simplemente no guardas una sola imagen y luego recortas según sea necesario dentro de tu programa...
Ha dicho que no quiere que sea accesible a malas manos... O por lo menos no directamente, aunque una captura de pantalla y listo, en fin. >)
  #10 (permalink)  
Antiguo 07/06/2005, 15:38
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por Beakdan
Pues si ese es el caso, y para seguir con lo "estándar", sería mejor definir un archivo con RIFF, y para realizar operaciones sobre el, las funciones mmio* de la librería winmm de la API. Codificados o no los datos, te será útil.
Y por cierto, un archivo de recursos admite cualquier clase de archivos. VB te los pondrá como "custom". Usando el compilador de recursos que seguramente tendrás en tu PC (rc.exe) puedes definir los identificadores que desees para los distintos tipos de archivo que se te ocurra incluir.
Pero si quiere que sea oculto, mi sistema es "propio de la casa", siempre tendrá los archivos a su disposición, y además así no depende de nadie... Cierto que para el ejemplo que nos pide es absurdo, pero...
  #11 (permalink)  
Antiguo 07/06/2005, 20:35
 
Fecha de Ingreso: junio-2005
Mensajes: 37
Antigüedad: 18 años, 10 meses
Puntos: 0
¿Acaso es tán difícil entender que sólo estoy haciendo un rompecabezas y no quiero que el que lo juegue pueda ver la imágen "desordenada" y "hacer trampa" antes de que la haya ordenado, sobre todo para vos, "David el Grande"? Y el punto es que quiero aprender a almacenar archivos dentro de un sólo archivo.

MaxExtreme y Beakdan muchas gracias por su ayuda.
Otra pregunta:
Estuve probando con el archivo de recursos pero no se como hacer para cargar un *.jpg, ya que los guarda en "Custom", ni como definir ese tipo de recursos. Muy agradecido si me ayudan
  #12 (permalink)  
Antiguo 08/06/2005, 14:18
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Cita:
Iniciado por Augusto1987
¿Acaso es tán difícil entender que sólo estoy haciendo un rompecabezas y no quiero que el que lo juegue pueda ver la imágen "desordenada" y "hacer trampa" antes de que la haya ordenado, sobre todo para vos, "David el Grande"? Y el punto es que quiero aprender a almacenar archivos dentro de un sólo archivo.

MaxExtreme y Beakdan muchas gracias por su ayuda.
Otra pregunta:
Estuve probando con el archivo de recursos pero no se como hacer para cargar un *.jpg, ya que los guarda en "Custom", ni como definir ese tipo de recursos. Muy agradecido si me ayudan
Lo que trato de decir es que no es necesario guardar varios archivos de imagen si solo necesitas una, lo de encriptar la imagen es otra historia, por eso no me gustó la indirecta que me hiciste
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #13 (permalink)  
Antiguo 08/06/2005, 14:20
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Bueno, pero de todas maneras, te ayudaré.
Tengo un control que te comprime cosas en su propio formato, de modo que ningún descompresor podrá descomprimirlo, de modo que nadie podrá ver esa una imagen, si quieres, te envío...
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #14 (permalink)  
Antiguo 08/06/2005, 16:14
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por David el Grande
Bueno, pero de todas maneras, te ayudaré.
Tengo un control que te comprime cosas en su propio formato, de modo que ningún descompresor podrá descomprimirlo, de modo que nadie podrá ver esa una imagen, si quieres, te envío...
¡Por favor! ¿Un control para guardar una imagen?
  #15 (permalink)  
Antiguo 08/06/2005, 16:41
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Puesto que ya estás usando el compilador de recursos de VB, seguiremos con eso. Pon todas las imágenes JPEG que requieras como "CUSTOM". Aquí es donde viene el pequeño problema. Aunque con la función LoadPicture puedes cargar un JPEG, no hay una función equivalente para cargarlo desde un recurso. La solución más fácil, aunque con toda certeza no la óptima, es, tomar el JPEG del recurso, meterlo en un buffer, y guardarlo temporalmente al disco. Leerlo con la función LoadPicture y almacenarlo en un StdPicture y destruir el archivo temporal. Te dejo este ejemplo:
Código:
Dim i As Long
Dim iFreeFile As Integer
Dim stdPic(3) As New StdPicture
Dim tmpBUffer() As Byte
	
	iFreeFile = FreeFile()
	'Hay cuatro jpg's en el archivo de recurso
	For i = 0 To 3
		Open "test.tmp" For Binary As #iFreeFile
		tmpBUffer = LoadResData(101 + i, "CUSTOM")
		Put #iFreeFile, , tmpBUffer
		Close #iFreeFile
		Set stdPic(i) = LoadPicture("test.tmp")
	Next i
	Kill "test.tmp"
	
	Picture1.Picture = stdPic(0)
	Picture2.Picture = stdPic(1)
	Picture3.Picture = stdPic(2)
	Picture4.Picture = stdPic(3)
Codificado o comprimido, si así lo has elegido, debes hacer el proceso contrario antes de guardarlo al archivo.

Procesar la información del JPEG una vez que está en memoria (sin el auxilio de alguna DLL), no es nada trivial. Una amplia lectura a la documentación del Independent JPEG Group te hará notar el motivo...
El mismo ejemplo con un archivo de recurso: StdPicture

Última edición por Beakdan; 08/06/2005 a las 18:23 Razón: Incluir Link
  #16 (permalink)  
Antiguo 08/06/2005, 19:07
 
Fecha de Ingreso: junio-2005
Mensajes: 37
Antigüedad: 18 años, 10 meses
Puntos: 0
David: Todo esto ha sido un malentendido, perdón si reaccioné mal de gusto
Gracias por tu ayuda, prefiero trabajar con un archivo de recursos ahora, cualquier cosa te digo

Beakdan: Gracias por el código. Encontré un tutorial que me ayudó a hacer eso pero guardando la imagen en C:, no en un buffer.
Una más, ni no es mucha molestia, ¿podrías explicarme cada una de las instrucciones y demás del código (inclusive "buffer", siempre lo leo y no se lo que es *avergonzado* )
  #17 (permalink)  
Antiguo 08/06/2005, 21:17
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Buffer tiene muchos significados pero en general designa una zona intermedia entre dos ámbitos. Un espacio en RAM para acomodar la imagen que después se guardará en disco, la SRAM en tus unidades lectoras para mejorar el tiempo de acceso (aunque en ese caso se le llama cache), los circuitos integrados que transforman los niveles de TTL de la motherboard a los niveles adecuados para RS232, etc. Se podría decir que buffer designa a un recurso que sirve para eliminar ciertos inconvenientes que hay cuando un medio/objeto/recurso accede a otro directamente. Mejor explicado, el diccionario Merriam-Webster
El ejemplo que te dejé guarda la imagen en el disco por unos instantes mediante un array que utilizo como buffer y por eso usé el nombre. Pero no te compliques, es sólo un array.

Última edición por Beakdan; 08/06/2005 a las 21:24
  #18 (permalink)  
Antiguo 09/06/2005, 06:21
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Sobre lo de leer imágenes JPEG, puedes usar sus funciones compilando la librería que te dan en la página del IJG y cargar la DLL resultante desde VB. No es del todo complicado.

Un buffer es un espacio intermediario entre un proceso/espacio y otro.

Se suele usar para guardar datos en lectura y luego escribirlos, hacer conversiones, etc etc. Cualquier operación sobre datos brutos se suele hacer en un buffer, que para el caso VB suelen ser arrays de bytes o similar.

También se usan en ciertas tareas como la grabación de CDs y demás como precaución. Necesitas tener datos intermedios directamente en la memoria por si ocurren parones, el disco duro se pone a hacer otra cosa, la grabadora encuentra una zona perfecta en el CD y la aplicación no manda a tiempo los datos y se estropea el CD, etc...
  #19 (permalink)  
Antiguo 09/06/2005, 11:47
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Cita:
Iniciado por Augusto1987
David: Todo esto ha sido un malentendido, perdón si reaccioné mal de gusto
Bueno, "si alguno no se equivoca en palabra, este sí es varón perfecto", no te guardo rencor, ok, nos vemos en otra oportunidad
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.

Última edición por David; 09/06/2005 a las 11:55
  #20 (permalink)  
Antiguo 09/06/2005, 11:56
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Exclamación

Cita:
Iniciado por MaxExtreme
¡Por favor! ¿Un control para guardar una imagen?
No precisamente guardar, me refería al hecho de encriptarla
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #21 (permalink)  
Antiguo 09/06/2005, 20:56
 
Fecha de Ingreso: junio-2005
Mensajes: 37
Antigüedad: 18 años, 10 meses
Puntos: 0
Como no quiero hacer otro tema, prefiero hacer otra pregunta acá:
¿Como hago para solucionar esto?

if X
form2.show
end if

Cuando se ejecuta "form2.show" cambia al form2 (modal1) pero cuando se descarga vuelve al "end if" siguiente. ¿Como puedo hacer para que al descargarse vuelva a un lugar determinado del código en form1?

Gracias de nuevo!
  #22 (permalink)  
Antiguo 10/06/2005, 14:58
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Cita:
Iniciado por Augusto1987
Como no quiero hacer otro tema, prefiero hacer otra pregunta acá:
¿Como hago para solucionar esto?

if X
form2.show
end if

Cuando se ejecuta "form2.show" cambia al form2 (modal1) pero cuando se descarga vuelve al "end if" siguiente. ¿Como puedo hacer para que al descargarse vuelva a un lugar determinado del código en form1?

Gracias de nuevo!
el hecho de que un formulario sea modal1, hace que no se ejecute ningún procedimiento en el módulo que lo llama, o sea, se queda parado en la línea Form2.Show 1 hasta que este se descarga, para que hagas lo que quieras deberás hacer un formulario no modal
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #23 (permalink)  
Antiguo 10/06/2005, 15:56
 
Fecha de Ingreso: junio-2005
Mensajes: 37
Antigüedad: 18 años, 10 meses
Puntos: 0
Ok. Eso está entendido. Igual, lo pude solucionar de esta manera:
El código sería algo así:

Line1:
If X then
...
Else
form2.show 1
goto line1
End if
  #24 (permalink)  
Antiguo 11/06/2005, 02:53
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por David el Grande
No precisamente guardar, me refería al hecho de encriptarla
Lo mismo me da... Para encriptar algo en un algoritmo desconocido no hace falta nada, simplemente lees el archivo, haces algo a los bytes y le guardas...
  #25 (permalink)  
Antiguo 11/06/2005, 02:55
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por Augusto1987
Ok. Eso está entendido. Igual, lo pude solucionar de esta manera:
El código sería algo así:

Line1:
If X then
...
Else
form2.show 1
goto line1
End if
Da igual lo que uses. Cuando el formalario modal se concluya sabes que se interpretará la siguiente línea.

Y por favor, no uses goto... Ese código es lo mismo que

Código:
While X
	Form.Show 1
Wend
En el 95% de los casos usar goto es malo. Sólo se debe usar si no hay una manera mejor de expresar algo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:12.