PDA

Ver la Versión Completa : Decodificar y codificar una imagen


djemix
08-10-2007, 16:39:53
Hola chicos!!! Tengo la siguiente cuestión que no se como abordar ni por donde. La cosa es que no se si se puede hacer, aunque creo que si, pero al menos me gustaria ver por donde deberia de mirar que estoy algo perdido.

Necesito hacer un modulo para mi aplicación de tal modo que cojo una imagen (del formato que sea mas comodo) y la decodifique en algo (ya sea en texto, hexadecimal, etc..). En resumen lo que quiero es poder trasmitir esto y luego el otro ordenador recibe la cadena mandada, la vuelve a codificar y monta la imagen.

No se si me explicado bien, espero que si.

A ver si alguien me puede orientar.

Saludoss!!

seoane
08-10-2007, 18:00:48
:confused: ¿Y por qué no envías las imágenes tal como están?, o es que tratas de mandar la imagen por algún medio que solo admite texto. Si es esto ultimo, la respuesta es base64, este sistema de codificación se invento precisamente para eso, para mandar archivos binarios codificados como texto. Busca en internet, hay un montón de ejemplos de como realizar esta codificación.

Si quieres algo mas sencillo pero menos eficiente, siempre puedes convertir byte a byte la imagen en texto (un byte = 2 caracteres). El código para hacer esto resulta ser muy sencillo, pero tiene el inconveniente de que duplica el tamaño de la imagen, es decir por cada byte necesitaras 2 caracteres, sin embargo el base64 solo necesita 4 caracteres por cada 3 bytes.

djemix
08-10-2007, 18:10:39
Es eso exactamente. Lo que intento es enviar una imagen por un sistema de radiofrecuencia que tengo montado... y lo que mando son cadenas de texto...

Y se me habia ocurrido lo de enviar imagenes... a ver que pasaba. Si me pudieras poner algun enlace con algun ejemplo de como convertir una imagen a base64 y alreves te estaria muy agradecido.

Saludosssssss!!!!

seoane
08-10-2007, 19:21:20
Vamos a ver que podemos hacer :)

Para realizar la codificación utilizaremos las librerías criptográficas que vienen con windows y que nos ahorraran mucho trabajo. Incluye la siguiente unit en tu proyecto:

base64.pas

unit base64;

interface

uses Windows, SysUtils, Classes;

function BinToStr(Binary: PByte; Len: Cardinal): String;
procedure StrToStream(Str: String; Stream: TStream);

implementation

const
CRYPT_STRING_BASE64 = 1;

function CryptBinaryToString(pbBinary: PByte; cbBinary: DWORD; dwFlags: DWORD;
pszString: PChar; var pcchString: DWORD): BOOL; stdcall;
external 'Crypt32.dll' name 'CryptBinaryToStringA';

function CryptStringToBinary(pszString: PChar; cchString: DWORD; dwFlags: DWORD;
pbBinary: PByte; var pcbBinary: DWORD; pdwSkip: PDWORD;
pdwFlags: PDWORD): BOOL; stdcall;
external 'Crypt32.dll' name 'CryptStringToBinaryA';

function BinToStr(Binary: PByte; Len: Cardinal): String;
var
Count: DWORD;
begin
Count:= 0;
if CryptBinaryToString(Binary,Len,CRYPT_STRING_BASE64,nil,Count) then
begin
SetLength(Result,Count);
if not CryptBinaryToString(Binary,Len,CRYPT_STRING_BASE64,PChar(Result),
Count) then
Result:= EmptyStr;
end;
end;

procedure StrToStream(Str: String; Stream: TStream);
var
Buffer: PByte;
Count: DWORD;
begin
Count:= 0;
if CryptStringToBinary(PChar(Str),Length(Str),CRYPT_STRING_BASE64,nil,Count,
nil,nil) then
begin
GetMem(Buffer,Count);
try
if CryptStringToBinary(PChar(Str),Length(Str),CRYPT_STRING_BASE64,Buffer,
Count,nil,nil) then
Stream.WriteBuffer(Buffer^,Count);
finally
FreeMem(Buffer);
end;
end;
end;

end.


Ahora para codificar un archivo en una cadena de texto:

var
Stream: TMemoryStream;
Texto: String;

begin
Stream:= TMemoryStream.Create;
try
Stream.LoadFromFile('imagen.jpg');
Texto:= BinToStr(Stream.Memory,Stream.Size);
finally
Stream.Free;
end;
end.


Para descifrar un texto y guardarlo en un archivo:

var
Stream: TFileStream;

begin
Stream:= TFileStream.Create('imagen.jpg',fmCreate);
try
StrToStream(Texto,Stream);
finally
Stream.Free;
end;
end.


Y a partir de aquí lo que quieras, jugando con los stream puedes evitar tener que guardar nada en el disco, y hacer todas las operaciones en memoria, pero eso ya depende de lo que quieras hacer.

djemix
09-10-2007, 09:45:11
Weno Seoane... como siempre... GENIAL!!:eek:

Era exactamente lo que buscaba y va perfecto.

Gracias por todo y un saludo!! Nos vemos en los foros!!:D

fide_uci
17-01-2011, 13:26:56
Esto era justamente lo que yo tambien andaba buscando para la implementacion del cliente de jabber que quiero hacer ggg. Muchas gracias Seoane.

ruedabeat2003
20-04-2012, 23:38:16
Esto me sirve para codificar un archivo PDF a string??????

escafandra
21-04-2012, 00:10:51
Eso sirve para codificar cualquier conjunto de datos a caracteres, pero no esperes convertir un pdf al texto que lees, sino a un conjunto de caracteres sin sentido aparente que representan al binario codificado.

Saludos.

ruedabeat2003
21-04-2012, 00:45:42
Sí, sí, lo entiendo a una cadena codificada de caracteres, que es precisamente lo que busco. Gracias por la respuesta.