【问题标题】:Delphi TBitmap to string via TBitmapSurface and back to TBitmapDelphi TBitmap 通过 TBitmapSurface 到字符串并返回到 TBitmap
【发布时间】:2016-10-02 19:42:32
【问题描述】:

我正在执行以下操作将 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。

【问题讨论】:

  • @Johan:将位图保存为PNG格式的代码,然后对PNG进行base64编码,然后对其进行解码,最后将其加载到位图中。唯一涉及的字符串是 base64。
  • @TomBrunberg base64 解码为 PNG,TBitmapCodecManager 可以加载 PNG。
  • 哎呀,打扰了。让我们清理不相关的 cmets。

标签: string delphi firemonkey tbitmap


【解决方案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;

【讨论】:

  • Base64ToBitmap 怎么样?字符串没问题,现在我需要回到 TBitmap。
  • @shariful 副手,我看不出 Base64ToBitmap() 有什么问题,但是我对使用 TBitmapSurface 不是很熟悉。
  • Remy,BitmapToBase64 的流大小和 Base64ToBitmap 的流大小不一样,你注意到了吗?这就是为什么没有分配 TBitmap 的原因吗?
  • @shariful 不,我没有注意到,因为我没有运行代码。 Base64 是一种无损格式,它解码为与其编码相同的大小,因此要么 TNetEncoding.Base64 被破坏,要么发生了其他事情。大小的实际差异是多少?您是否将原始字节与解码字节进行比较以寻找差异?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多