PDA

Ver la Versión Completa : Imagenes en archivos.


MAXIUM
11-03-2009, 18:30:03
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 (http://www.cityinthesky.co.uk/cryptography.html) 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
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.


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
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.