【问题标题】:convert base64 to bitmap将base64转换为位图
【发布时间】:2014-02-20 13:21:54
【问题描述】:

我尝试将 base64 字符串转换为位图,但随后我得到一个黑色图像.. 这是我用来解码的脚本:

function Base64ToBitmap(const S: string): TBitmap;
var
SS: TStringStream;
V: string;
begin
V := Decode(S);
SS := TStringStream.Create(V);
try
Result := TBitmap.Create;
Result.LoadFromStream(SS);
finally
SS.Free;
end;
end;

这是解码脚本:

function Decode(const Input: AnsiString): string;
var
  bytes: TBytes;
  utf8: UTF8String;
begin
  bytes := EncdDecd.DecodeBase64(Input);
  SetLength(utf8, Length(bytes));
  Move(Pointer(bytes)^, Pointer(utf8)^, Length(bytes));
  Result := string(utf8);
end;

位图到base64

function BitmapToBase64(ABitmap: TBitmap): string;
var
SS: TStringStream;
V: string;
begin
SS := TStringStream.Create('');
try
ABitmap.SaveToStream(SS);
V := SS.DataString;
Result := Encode(V);
finally
SS.Free;
end;
end;

编码:

function Encode(const Input: string): AnsiString;
var
  utf8: UTF8String;
begin
  utf8 := UTF8String(Input);
  Result := EncdDecd.EncodeBase64(PAnsiChar(utf8), Length(utf8));
end;

为什么我会黑屏? base64 字符串是截图。

【问题讨论】:

  • 请提供包含编码和解码的SSCCE
  • @DavidHeffernan 完成 :)
  • SSCCE 将包括从位图到字符串到 base 64 的完整往返行程,然后再返回。在一个程序中。
  • 哦,我对 image1 做了一个截图,然后我通过 BitmapToBase64(image1.Picture.bitmap) 通过套接字发送图像然后我将它转换为: Image1.Picture.Bitmap.Assign(base64tobitmap(recievedtext) );

标签: delphi bitmap base64


【解决方案1】:

您的代码过于复杂。这就是你所需要的:

{$APPTYPE CONSOLE}

uses
  System.SysUtils,
  System.Classes,
  Vcl.Graphics,
  Soap.EncdDecd;

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;

function BitmapFromBase64(const base64: string): TBitmap;
var
  Input: TStringStream;
  Output: TBytesStream;
begin
  Input := TStringStream.Create(base64, TEncoding.ASCII);
  try
    Output := TBytesStream.Create;
    try
      Soap.EncdDecd.DecodeStream(Input, Output);
      Output.Position := 0;
      Result := TBitmap.Create;
      try
        Result.LoadFromStream(Output);
      except
        Result.Free;
        raise;
      end;
    finally
      Output.Free;
    end;
  finally
    Input.Free;
  end;
end;

var
  Bitmap: TBitmap;
  s: string;

begin
  Bitmap := TBitmap.Create;
  Bitmap.SetSize(100,100);
  Bitmap.Canvas.Brush.Color := clRed;
  Bitmap.Canvas.FillRect(Rect(20, 20, 80, 80));
  s := Base64FromBitmap(Bitmap);
  Bitmap.Free;
  Bitmap := BitmapFromBase64(s);
  Bitmap.SaveToFile('C:\desktop\temp.bmp');
end.

【讨论】:

  • 我还是黑屏:(
  • 你的意思是当你在我的回答中运行程序时?
  • 是的,也许套接字不能发送所有字符?
  • 也许吧。但是你问的问题是关于 base64 编码的。我的答案中的函数可能是在Soap.EncdDecd 之上实现它的规范方式。
  • @user2735398 你试过比较发送和接收的数据吗?
猜你喜欢
  • 1970-01-01
  • 2017-02-27
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 2014-01-06
相关资源
最近更新 更多