2016-06-02 1 views
2

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.

+0

@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. –

+0

@TomBrunberg la base64 décode en PNG et TBitmapCodecManager peut charger un fichier PNG. –

+0

Ouch, désolé pour le bruit. Nettoyons les commentaires non pertinents. –

Répondre

4

Dans BitmapToBase64(), vous passez le TMemoryStream lui-même à TNetEncoding.Base64.EncodeBytesToString(), qui n'accepte pas un flux comme entrée pour commencer. Vous devez passer la valeur de la propriété Memory à la place du flux:

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.Memory, AStream.Size); 
    finally 
    AStream.Free; 
    BS.Free; 
    end; 
end; 
+0

qu'en est-il de Base64ToBitmap? La chaîne est ok, maintenant j'ai besoin de TBitmap. – shariful

+0

@shariful désinvolte, je ne vois rien de mal avec Base64ToBitmap(), mais je ne suis pas très familier avec le travail avec TBitmapSurface. –

+0

Remy, la taille du flux de BitmapToBase64 et la taille du flux de Base64ToBitmap n'est pas la même, l'avez-vous remarqué? Est-ce le cas pourquoi TBitmap n'est pas affecté? – shariful