2016-06-02 11 views
2

ich folgende tue TBitmap (Firemonkey) in String zu konvertieren:Delphi TBitmap bespannen über TBitmapSurface und zurück zu 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; 

Wie kann ich die Zeichenfolge wieder in TBitmap wiederherstellen? Ich habe folgende, die nicht TBitmap produziert:

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; 

ich kleinere Größe von base64 String benötigen, damit ich es zu DataSnap-Server übertragen kann. Die normale base64-Zeichenfolge gibt mir nicht genügend Speicher, da die Größe der Zeichenfolge größer als 200000 - 1000000 ist.

+0

@Johan: den Code ein Bitmap PNG-Format speichern und dann die PNG Base64-Kodierung, Dekodierung es dann, und schließlich in eine Bitmap zu laden. Die einzige beteiligte Zeichenfolge ist die base64. –

+0

@TomBrunberg dekodiert die Base64 zu einem PNG, und TBitmapCodecManager kann ein PNG laden. –

+0

Autsch, Entschuldigung für den Lärm. Lass uns irrelevante Kommentare aufräumen. –

Antwort

4

In BitmapToBase64() übergeben Sie die TMemoryStream selbst an TNetEncoding.Base64.EncodeBytesToString(), die einen Stream als Eingabe zu Beginn nicht akzeptiert. Sie müssen stattdessen den Wert der Memory Eigenschaft Stream weitergeben müssen:

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

Was ist mit Base64ToBitmap? String ist in Ordnung, jetzt brauche ich zurück zu TBitmap. – shariful

+0

@shariful offhand, ich sehe nichts falsch mit Base64ToBitmap(), aber dann bin ich nicht sehr vertraut mit der Arbeit mit TBitmapSurface. –

+0

Remy, BitmapToBase64 Stream-Größe und Base64ToBitmap Stream-Größe ist nicht gleich, haben Sie das bemerkt? Ist dies der Fall, warum TBitmap nicht zugewiesen ist? – shariful