Ver Mensaje Individual
  #8  
Antiguo 10-02-2016
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 1.941
Reputación: 13
escafandra Va camino a la famaescafandra Va camino a la fama
Yo utilizo la API para esos fines:

Código Delphi [-]
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';

//---------------------------------------------------------------------------
// Codifica un TNMemoryStrean a cadena Encode64
function StreamToStrB64(MStream: TMemoryStream; var Str: String): boolean;
var
  Size: DWORD;
begin
  Result:= CryptBinaryToString(MStream.Memory, MStream.Size, CRYPT_STRING_BASE64, 0 , Size);
  if Result then
  begin
    SetLength(Str, Size);
    Result:= CryptBinaryToString(MStream.Memory, MStream.Size, CRYPT_STRING_BASE64, @Str[1], Size);
  end;
end;

//---------------------------------------------------------------------------
// Decodifica una cadena Encode64 a su binario original en un TMemoryStream
function StrB64ToStream(var Str: String; MStream: TMemoryStream): boolean;
var
  Size: DWORD;
begin
  Result:= CryptStringToBinary(@Str[1], Length(Str), CRYPT_STRING_BASE64, 0, Size, nil, nil);
  if Result then
  begin
    MStream.SetSize(Size);
    Result:= CryptStringToBinary(@Str[1], Length(Str), CRYPT_STRING_BASE64, MStream.Memory, Size, nil, nil);
  end;
end;

Para el tema en cuestión, el uso sería:

Código Delphi [-]
var
  MStream: TMemoryStream;
  S: String;  // Aquí tendremos la cadena BASE64 de la Imagen
begin
  MStream:= TMemoryStream.Create;
  Image1.Picture.Bitmap.SaveToStream(MStream);
  StreamToStrB64(MStream, S);
  MStream.Free;
end;

Por si interesa, aquí mostré un ejemplo de como leer una imagen codificada en BASE64 sin conocer el tipo de la misma usando GDI+.


Saludos,
Responder Con Cita