Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-10-2007
djemix djemix is offline
Miembro
NULL
 
Registrado: ago 2006
Posts: 46
Poder: 0
djemix Va por buen camino
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!!
Responder Con Cita
  #2  
Antiguo 08-10-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
NULL
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 19
seoane Va por buen camino
¿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.
Responder Con Cita
  #3  
Antiguo 08-10-2007
djemix djemix is offline
Miembro
NULL
 
Registrado: ago 2006
Posts: 46
Poder: 0
djemix Va por buen camino
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!!!!
Responder Con Cita
  #4  
Antiguo 08-10-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
NULL
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 19
seoane Va por buen camino
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.

Última edición por seoane fecha: 08-10-2007 a las 22:39:34.
Responder Con Cita
  #5  
Antiguo 09-10-2007
djemix djemix is offline
Miembro
NULL
 
Registrado: ago 2006
Posts: 46
Poder: 0
djemix Va por buen camino
Weno Seoane... como siempre... GENIAL!!

Era exactamente lo que buscaba y va perfecto.

Gracias por todo y un saludo!! Nos vemos en los foros!!
Responder Con Cita
  #6  
Antiguo 17-01-2011
Avatar de fide_uci
fide_uci fide_uci is offline
Miembro
NULL
 
Registrado: ene 2009
Ubicación: Cuba - La Habana
Posts: 226
Poder: 11
fide_uci Va por buen camino
Esto era justamente lo que yo tambien andaba buscando para la implementacion del cliente de jabber que quiero hacer ggg. Muchas gracias Seoane.
Responder Con Cita
  #7  
Antiguo 20-04-2012
ruedabeat2003 ruedabeat2003 is offline
Miembro
NULL
 
Registrado: mar 2007
Posts: 66
Poder: 13
ruedabeat2003 Va por buen camino
Archivo PDF a un string.

Esto me sirve para codificar un archivo PDF a string??????
Responder Con Cita
  #8  
Antiguo 21-04-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 1.961
Poder: 14
escafandra Va camino a la famaescafandra Va camino a la fama
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.
Responder Con Cita
  #9  
Antiguo 21-04-2012
ruedabeat2003 ruedabeat2003 is offline
Miembro
NULL
 
Registrado: mar 2007
Posts: 66
Poder: 13
ruedabeat2003 Va por buen camino
Sí, sí, lo entiendo a una cadena codificada de caracteres, que es precisamente lo que busco. Gracias por la respuesta.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ayuda para codificar datos en el encabezado Vinicio PHP 1 08-10-2007 09:33:21
Codificar datos Drake C++ Builder 1 13-01-2006 18:00:27
Codificar una imagen o un fichero D@byt Varios 1 27-05-2005 01:44:32
Decodificar año rafadrover SQL 4 11-01-2005 02:28:15
Codificar información sharky Conexión con bases de datos 2 14-12-2004 00:43:40


La franja horaria es GMT +2. Ahora son las 15:41:43.


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