Delphi TBitmap в строку через TBitmapSurface и обратно в TBitmap
Я делаю следующее, чтобы преобразовать TBitmap(Firemonkey) в строку:
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;
Как я могу вернуть строку обратно в TBitmap? Я сделал следующее, которое не производит 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;
Мне нужен меньший размер строки base64, чтобы я мог передать ее на сервер Datasnap. Обычная строка base64 дает мне недостаточно памяти, так как размер строки превышает 200000 - 1000000 в длину.
1 ответ
В BitmapToBase64()
Вы проходите TMemoryStream
сам к TNetEncoding.Base64.EncodeBytesToString()
, который не принимает поток в качестве входных данных для начала. Вам нужно передать значение потока Memory
свойство вместо:
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;