que je fais ci-dessous pour convertir TBitmap (FireMonkey) à la chaîne:Delphi TBitmap à chaîne via TBitmapSurface et retour à TBitmap
function BitmapToBase64(Bitmap: Tbitmap): string;
var
BS: TBitmapSurface;
AStream: TMemoryStream;
begin
BS := TBitmapSurface.Create;
BS.Assign(Bitmap);
BS.SetSize(300, 200);
AStream := TMemoryStream.Create;
try
TBitmapCodecManager.SaveToStream(AStream, BS, '.png');
Result := TNetEncoding.Base64.EncodeBytesToString(AStream, AStream.Size);
finally
AStream.Free;
BS.Free;
end;
end;
Comment puis-je revenir la chaîne de retour à TBitmap? Je l'ai fait suivant qui ne produit pas TBitmap:
procedure Base64ToBitmap(AString: String; Result : Tbitmap);
var
ms : TMemoryStream;
BS: TBitmapSurface;
bytes : TBytes;
begin
bytes := TNetEncoding.Base64.DecodeStringToBytes(AString);
ms := TMemoryStream.Create;
try
ms.WriteData(bytes, Length(bytes));
ms.Position := 0;
BS := TBitmapSurface.Create;
BS.SetSize(300, 200);
try
TBitmapCodecManager.LoadFromStream(ms, bs);
Result.Assign(bs);
finally
BS.Free;
end;
finally
ms.Free;
end;
end;
J'ai besoin de plus petite taille de chaîne base64 pour que je puisse le transmettre au serveur Datasnap. La chaîne base64 normale me donne une mémoire insuffisante car la taille de la chaîne dépasse 200000 - 1000000 de longueur.
@Johan: le code de sauvegarde d'un bitmap au format PNG, base64 puis coder le décodage PNG, puis, et enfin le charger dans un bitmap. La seule chaîne impliquée est la base64. –
@TomBrunberg la base64 décode en PNG et TBitmapCodecManager peut charger un fichier PNG. –
Ouch, désolé pour le bruit. Nettoyons les commentaires non pertinents. –