A veces, nuestros programas usan imágenes JPEG, como por ejemplo nuestro logo, o cosas así, y una de las cosas que a uno le preocupa es ¿y si alguno me cambia el logo?.
Para evitarlo, guardaremos nuestros JPGs encriptados, y los desencriptaremos en el momento de cargarlos.
Para esto, aqui tienes dos funciones, una que encripta un fichero JPG cualquiera con una clave cualquiera (que llamada dos veces sobre el mismo fichero tambien serviría para desencriptar el fichero), y otra, que nos permitirá cargar un JPG encriptado en un TImage cualquiera de nuestra form.
Para probar este ejemplo necesitas:
- Añadir Jpeg al uses de tu form
- Dos TButtons en una form (Button1 y Button2)
- Un TImage (Image1)
Y añadir estos códigos a los eventos OnClick de los botones.
El Button1 encriptará un bitmap (en el ejemplo llamado Foto.JPG, y el fichero resultante sera llamado FotoEnc.jpg) y el Button2 cargará ese bitmap (el encriptado, osea el FotoEnc.jpg) en nuestro Image1.
OJO: Ninguna de las dos funciones detecta si los ficheros existen, eso es cosa tuya...
procedure TForm1.Button1Click(Sender: TObject);
procedure EncriptaJPG(Ori,Dest: string; Clave:integer);
{ Ori: Nombre del fichero original (Source filename)
Dest: Nombre del fichero encriptado (Destination filename) }
const
MAXBUFFER = 4096; //4k de buffer;
var
Buffer : array[1..MAXBUFFER] of byte;
Origen, Destino : TFileStream;
n, Leidos : integer;
begin
Origen :=TFileStream.Create(Ori,fmOpenRead+fmShareDenyWrite);
Destino :=TFileStream.Create(Dest,fmCreate);
RandSeed:=Clave;
try
repeat
Leidos:=Origen.Read( Buffer[1],MAXBUFFER );
for n:=1 to Leidos do begin
Buffer[n]:=Buffer[n] XOR Random(256);
end;
Destino.Write(Buffer[1],Leidos);
until (Leidos < MAXBUFFER);
finally
Origen.Free;
Destino.Free;
end;
end;
begin
EncriptaJPG('Foto.jpg','FotoEnc.jpg',666);
end;
|
procedure TForm1.Button2Click(Sender: TObject);
procedure CargaJpgEncriptado(Nombre: string;Imagen: TImage;Clave:integer);
// uses jpeg;
type
ByteBuffer = array[0..9999999] of Byte;
var
PByteBuffer : ^ByteBuffer;
Origen : TMemoryStream;
n : integer;
JPGTemp : TJPegImage;
begin
Origen:=TMemoryStream.Create;
JPGTemp:=TJPegImage.Create;
try
Origen.LoadFromFile(Nombre);
RandSeed:=Clave;
PByteBuffer:=Origen.Memory;
for n:=0 to Origen.Size do begin
PByteBuffer^[n]:=(PByteBuffer^[n] xor Random(256));
end;
Origen.Seek(0,soFromBeginning);
JPGTemp.LoadFromStream(Origen);
Image1.Picture.Bitmap.Assign(JPGTemp);
finally
Origen.Free;
JPGTemp.Free;
end;
end;
begin
CargaJpgEncriptado('FotoEnc.jpg',Image1,666);
end;
|
Actualizado el 20/08/2005 Gracias a Jorge por la traducción)
|