Search code examples
delphibitmapbase64

convert base64 to bitmap


I try to convert a base64 string to bitmap but then i get a black image.. This is the script that i use to decode:

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;

This is the decode script:

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;

BitMap to 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;

Encode:

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

Why i get a black screen? the base64 string is a screenshot.


Solution

  • Your code is needlessly complex. This is all you need:

    {$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.