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';
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;
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; 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,