将 BitMap 转换为不带换行符的字符串?
Convert BitMap to string without line breaks?
我在某处找到了将 BitMap 转换为字符串的代码:
function Base64FromBitmap(Bitmap: TBitmap): string;
var
Input: TBytesStream;
Output: TStringStream;
begin
Input := TBytesStream.Create;
try
Bitmap.SaveToStream(Input);
Input.Position := 0;
Output := TStringStream.Create('', TEncoding.ASCII);
try
Soap.EncdDecd.EncodeStream(Input, Output);
Result := Output.DataString;
finally
Output.Free;
end;
finally
Input.Free;
end;
end;
但是,这返回了一段换行。是否可以单行不换行?
Soap.EncdDecd.EncodeStream()
被硬编码为每 75 个字符输出一个换行符。更改它的唯一方法是复制 Soap.EncdDecd.pas
、编辑它,然后将副本添加到您的项目(如果您的项目启用了运行时包,则此方法不起作用)。
您可以使用 Indy 的 TIdEncoderMIME
class 作为替代。它不输出换行符:
uses
..., IdCoderMIME;
function Base64FromBitmap(Bitmap: TBitmap): string;
var
Input: TMemoryStream;
begin
Input := TMemoryStream.Create;
try
Bitmap.SaveToStream(Input);
Input.Position := 0;
Result := TIdEncoderMIME.EncodeStream(Input);
finally
Input.Free;
end;
end;
XE7 引入了包含 base64 编码器的 System.NetEncoding
单元。这是为了使用而不是 Soap.EncdDecd
中的编码器。
constructor of TBase64Encoding
具有允许您指定每行字符(和换行符文本)的重载。不幸的是,Embarcadero 还没有屈尊提供文档,所以我们需要阅读源代码来确定究竟要传递什么。这样做之后,很明显只有当每行的字符数严格为正时才会插入换行符。所以像这样创建一个编码对象:
Encoding := TBase64Encoding.Create(0);
一旦你有了合适的编码对象,使用Encode
to encode your stream of bytes to text. And 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
and 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
单元的一部分,但添加为 class 帮助程序就足够简单了。
我在某处找到了将 BitMap 转换为字符串的代码:
function Base64FromBitmap(Bitmap: TBitmap): string;
var
Input: TBytesStream;
Output: TStringStream;
begin
Input := TBytesStream.Create;
try
Bitmap.SaveToStream(Input);
Input.Position := 0;
Output := TStringStream.Create('', TEncoding.ASCII);
try
Soap.EncdDecd.EncodeStream(Input, Output);
Result := Output.DataString;
finally
Output.Free;
end;
finally
Input.Free;
end;
end;
但是,这返回了一段换行。是否可以单行不换行?
Soap.EncdDecd.EncodeStream()
被硬编码为每 75 个字符输出一个换行符。更改它的唯一方法是复制 Soap.EncdDecd.pas
、编辑它,然后将副本添加到您的项目(如果您的项目启用了运行时包,则此方法不起作用)。
您可以使用 Indy 的 TIdEncoderMIME
class 作为替代。它不输出换行符:
uses
..., IdCoderMIME;
function Base64FromBitmap(Bitmap: TBitmap): string;
var
Input: TMemoryStream;
begin
Input := TMemoryStream.Create;
try
Bitmap.SaveToStream(Input);
Input.Position := 0;
Result := TIdEncoderMIME.EncodeStream(Input);
finally
Input.Free;
end;
end;
XE7 引入了包含 base64 编码器的 System.NetEncoding
单元。这是为了使用而不是 Soap.EncdDecd
中的编码器。
constructor of TBase64Encoding
具有允许您指定每行字符(和换行符文本)的重载。不幸的是,Embarcadero 还没有屈尊提供文档,所以我们需要阅读源代码来确定究竟要传递什么。这样做之后,很明显只有当每行的字符数严格为正时才会插入换行符。所以像这样创建一个编码对象:
Encoding := TBase64Encoding.Create(0);
一旦你有了合适的编码对象,使用Encode
to encode your stream of bytes to text. And 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
and 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
单元的一部分,但添加为 class 帮助程序就足够简单了。