Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Imagenes en archivos. (https://www.clubdelphi.com/foros/showthread.php?t=63985)

MAXIUM 11-03-2009 18:30:03

Imagenes en archivos.
 
Hola, se puede meter imágenes y texto en un archivo binario, si así cuales son los pasos. Gracias

MAXIUM 12-03-2009 00:35:31

MAXIUM, tal vez las venerabla DLL's puedan serte util ;)

MAXIUM 12-03-2009 00:37:07

Oh si, como no se me habian ocurrido antes. Pero el problema esta en que una DLL es facil de "desarmar", la idea es que nadie pueda acceder a su contenido sin el código adecuado, algo muy similar a la estructura de un clásico archivo binario.

MAXIUM 12-03-2009 00:38:03

Mmm... tambien podrías usar una .bpl compilada como runtimeonly y la adjuntas a tu ejecutable.

MAXIUM 12-03-2009 00:38:50

tambien he buscado información al respecto, pero no me sale, no se como usarlas en tiempo de ejecución.

MAXIUM 12-03-2009 00:39:20

Yo tampoco.

MAXIUM 12-03-2009 00:40:21

Intentare con BlockWrite, pero tengo poca experiencia, ojalas salga algo de todo esto además de dolor de cabeza :(

dec 12-03-2009 00:49:36

Hola,

Lo primero que se me ocurre, bueno, lo primero que se me ocurre es que tú y yo debemos ser familiares lejanos... o cercanos. :D :D

Y, lo segundo que se me ocurre... es trabajar con archivos comprimidos (Zip, por ejemplo). Desde Delphi es perfectamente posible trabajar con ellos. Pueden contener literalmente lo que quieras, incluso distintos archivos, juntos, pero, no revueltos. Pueden tener "contraseña", pueden estar cifrados, es posible añadir o eliminar archivos "en tiempo de ejecución", en fin, no sé cómo lo ves. :)

MAXIUM 12-03-2009 01:03:04

Y ¿él quien es?

MAXIUM 12-03-2009 01:08:58

Se llama DEC, es una buena persona :p

Buena idea, además del passord, podría encriptar tanto las imagenes como los archivos de texto que contengan, ya que a pesar de estar con clave, la descompresión se realiza en la carpeta TEMP, es decir, al ejecutar la aplicación, esta abre el archivo zipeado con mi super últra secreta clave y descomprime el contedio en la TEMP del sistema la cual es accesible para cualquiera, obvio que usuario vulgar desconoce esto, ops! me acabo de delatar :(

Pero es una buena idea, probare los tiempod e respuestas con otros compresores gratuitos como los CAB que son nativos en Windows y solo necesito llamar las aplicaiones externas del sistema en modo silecioso. Gracias DEC ;)

dec 12-03-2009 01:14:07

Hola,

¡Y es una bueenaa persooooonaaaaoaoaoa! (Léase cual flamenco cantando por soleares) :D :D

No sé si eso de que los archivos comprimidos utilizan la carpeta temporal de Windows es realmente siempre así. Creo recordar que en algún componente que he usado (Turbo Power Abbrevia) esto era algo opcional. Sea como fuese, siempre que no supusiese una merma en el rendimiento, y, tal como dices, los archivos pueden estar cifrados, de modo que en caso de que llegasen al disco duro, estarían cifrados, y tú desde tu aplicación podrías descifrarlos al momento de usarlos. Aunque igual en esto no estoy tampoco del todo en lo cierto, porque, si tú quieres usar una imagen (LoadFromFile()) habrás de tener un archivo "en claro", no cifrado. Tal vez pase el tema por tratar de evitar la carpeta temporal, y también por cifrar y descifrar "en memoria" (igual esto es una gilipollez) y trabajar de ese modo.

JXJ 12-03-2009 01:51:07

cifrar y descifrar "en memoria"

¿eso como se hace?

dec 12-03-2009 01:55:31

Hola,

Tienes razón, no suena muy descriptivo eso. Pero, es que no me sabré explicar de otro modo. Se trataría, básicamente, de que el archivo "en claro" no residiera nunca en el disco duro. Cargar el archivo cifrado en una variable (en memoria) y descifrarlo ahí. Creo que los componentes que he venido usando para estos menesteres permiten algo así, pero, ahora mismo tampoco estoy seguro al cien por cien.

Neftali [Germán.Estévez] 12-03-2009 10:31:44

¿Y utlizando Streams?
(1) Cargar en un Stream la imagen.
(2) Guardar el tamaño
(3) Añadir el Texto
(4) Guardar el tamaño
(5) Aplicarle algoritmo de encriptación con key
(6) Guardarlo a disco.

Eso es la teoría. :D:D:D

cmm07 12-03-2009 13:59:31

tantos MAXIUM ?????????, :eek::eek::eek::eek::eek::eek::eek::eek::eek:

dec 12-03-2009 14:16:27

Hola,

Ya ves, hay personas a las que que no basta con tener doble personalidad. :rolleyes: :D

MAXIUM 12-03-2009 15:18:10

Gracias, vamoS a probrar.

Neftali [Germán.Estévez] 12-03-2009 19:08:50

1 Archivos Adjunto(s)
A ver no estoy muy puesto en el tema, pero lo que quería explicar es más o menos esto. Seguro que es optimizable, ya digo que no estoy muy puesto, pero así creo que se entiende mejor:

(1) Poner un TImage en el form, con un bitmap.
(2) POner un memo con un texto.
(3) Ejecutar el código siguiente.

El resultado es un fichero en disco con:

10 dígitos correspondiente al tamaño del memo
10 dígitos correspondientes al tamaño de la imagen
El contenido del memo
El contenido de la imagen

Si lo abrís con un editor hexadecimal se ve perfectamente.
Si antes de guardar se le aplica un algoritmo y listo.

Con los dos tamaños (ocupan cada uno 10 posiciones) se debería poder hacer el paso contrario sin problemas.

Código Delphi [-]
var
  i:Integer;
  s:Int64;
  Str:String;
  buff: array [0..9] of byte;
  f1, F2: TFileStream;
  s1:TMemoryStream;
  buffmemo: array [0..4000] of byte;
  sMemo:Integer;
begin

  f1 := TFileStream.Create('.\I.dat', fmCreate);
  f2 := TFileStream.Create('.\M.dat', fmCreate);
  s1 := TMemoryStream.Create;


  // MEMO
  Memo1.Lines.SaveToStream(f2);
  s := sizeof(f2);
  for i := 0 to Min(4000, Length(Memo1.Lines.TExt)) do begin
    buffmemo[i] := Ord(Memo1.Lines.Text[i + 1]);
  end;
  sMemo := i;
  Str := DupeString('0', 10) + IntToStr(sMemo);
  Str := Copy(Str, Length(Str) - 10 + 1, 10);

  // Escribir Tamaño Memo
  for i := 0 to 9 do begin
    buff[i] := Ord(Str[i + 1]);
  end;
  // Escribimos el tamaño
  f1.WriteBuffer(buff, 10);

  // Imagen
  Image1.Picture.Bitmap.SaveToStream(s1);

  s := s1.Size;
  Str := DupeString('0', 10) + IntToStr(s);
  Str := Copy(Str, Length(Str) - 10 + 1, 10);

  // Escribir Tamaño imagen
  for i := 0 to 9 do begin
    buff[i] := Ord(Str[i + 1]);
  end;
  // Escribimos el tamaño
  f1.WriteBuffer(buff, 10);


  // escribir el memo
  f1.WriteBuffer(buffmemo, sMemo);
  // escribir la imagen
  Image1.Picture.Bitmap.SaveToStream(f1);

  FreeAndNil(s1);
  FreeAndNil(f2);
  FreeAndNil(f1);

MAXIUM 13-03-2009 01:36:17

Oh! excelentisimo. Gracias Neftali, lo voy a estudiar.

Realizar el proceso inverso no creo que me complique, pero tambien quiero ver como meter 2 imagenes de distinto tamañano en un solo archivo o el memo y la imagen en un solo fichero resultante.

Muchisismas gracias.

Neftali [Germán.Estévez] 13-03-2009 10:04:46

Cita:

Empezado por MAXIUM (Mensaje 341306)
pero tambien quiero ver como meter 2 imagenes de distinto tamañano en un solo archivo o el memo y la imagen en un solo fichero resultante.

Bueno, no tiene más complicación que copiar un trozo de código de ahí para la segunda imagen o seguir el mismo sistema.
Al principio se guardan los dos tamaños y luego los dos objetos, pero puedes variar esa estructura a tu gusto.

* Guardar número de obtejos, luego los tamaños y luego los objetos.
* Números de objetos y luego tamaño y tipo de cada uno de ellos y al final los objetos
* ...

La combinación que desees.


La franja horaria es GMT +2. Ahora son las 05:04:27.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi