Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Decodificar y codificar una imagen (https://www.clubdelphi.com/foros/showthread.php?t=48924)

djemix 08-10-2007 16:39:53

Decodificar y codificar una imagen
 
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
Código Delphi [-]
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:
Código Delphi [-]
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:
Código Delphi [-]
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

Archivo PDF a un string.
 
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.


La franja horaria es GMT +2. Ahora son las 03:08:29.

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