XE7引入了
System.NetEncoding
单元,其中包含一个base64编码器。这是用于替代
Soap.EncdDecd
编码器的。
TBase64Encoding
构造函数有多个重载,允许您指定每行字符数(以及换行文本)。不幸的是,Embarcadero尚未提供文档,因此我们需要阅读源代码才能确定要传递的内容。经过这样的处理,很明显只有在每行字符数严格为正时才插入换行符。因此可以像这样创建一个编码对象:
Encoding := TBase64Encoding.Create(0);
一旦你有了一个合适的编码对象,使用
Encode
将字节流编码为文本。使用
Decode
反转此过程。
它可能看起来像这样:
function Base64FromBitmap(Bitmap: TBitmap): string;
var
Input: TBytesStream;
Output: TStringStream;
Encoding: TBase64Encoding;
begin
Input := TBytesStream.Create;
try
Bitmap.SaveToStream(Input);
Input.Position := 0;
Output := TStringStream.Create('', TEncoding.ASCII);
try
Encoding := TBase64Encoding.Create(0);
try
Encoding.Encode(Input, Output);
Result := Output.DataString;
finally
Encoding.Free;
end;
finally
Output.Free;
end;
finally
Input.Free;
end;
end;
procedure BitmapFromBase64(Base64: string; Bitmap: TBitmap);
var
Input: TStringStream;
Output: TBytesStream;
Encoding: TBase64Encoding;
begin
Input := TStringStream.Create(Base64, TEncoding.ASCII);
try
Output := TBytesStream.Create;
try
Encoding := TBase64Encoding.Create(0);
try
Encoding.Decode(Input, Output);
Output.Position := 0;
Bitmap.LoadFromStream(Output);
finally
Encoding.Free;
end;
finally
Output.Free;
end;
finally
Input.Free;
end;
end;
或者您可以使用EncodeBytesToString
和DecodeStringToBytes
。可能看起来是这样的:
function Base64FromBitmap(Bitmap: TBitmap): string;
var
Stream: TBytesStream;
Encoding: TBase64Encoding;
begin
Stream := TBytesStream.Create;
try
Bitmap.SaveToStream(Stream);
Encoding := TBase64Encoding.Create(0);
try
Result := Encoding.EncodeBytesToString(Copy(Stream.Bytes, 0, Stream.Size));
finally
Encoding.Free;
end;
finally
Stream.Free;
end;
end;
procedure BitmapFromBase64(Base64: string; Bitmap: TBitmap);
var
Stream: TBytesStream;
Bytes: TBytes;
Encoding: TBase64Encoding;
begin
Stream := TBytesStream.Create;
try
Encoding := TBase64Encoding.Create(0);
try
Bytes := Encoding.DecodeStringToBytes(Base64);
Stream.WriteData(Bytes, Length(Bytes));
Stream.Position := 0;
Bitmap.LoadFromStream(Stream);
finally
Encoding.Free;
end;
finally
Stream.Free;
end;
end;
如果我们能够像zlib提供的压缩和解压缩流一样拥有某些东西,那将会非常好。我们可以创建一个编码流,将位图保存到其中,并读取出base64文本。在另一个方向上,我们将base64文本输入解码流,然后从中加载位图。这应该真正成为
NetEncoding
单元的一部分,但将其作为类助手添加也很简单。