作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在执行以下操作将 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。
最佳答案
在 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;
关于string - Delphi TBitmap 通过 TBitmapSurface 到字符串并返回到 TBitmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37602538/
我正在执行以下操作将 TBitmap(Firemonkey) 转换为字符串: function BitmapToBase64(Bitmap: Tbitmap): string; var BS: T
我是一名优秀的程序员,十分优秀!