将Bitmap位图转化为base64字符串互转

来源:互联网 发布:定义一个二维数组 编辑:程序博客网 时间:2024/05/29 13:24
unit Unit1;


interface


uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, FMX.ScrollBox, FMX.Memo, FMX.Objects;


type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Memo1: TMemo;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;


implementation


{$R *.fmx}
  uses
    Soap.EncdDecd;


//建议看一下这个文章https://www.cnblogs.com/studypanp/p/4906349.html

 /////--------流转换Begin------- //////////////////
function StreamToBytes(aStream:TStream):TBytes;
begin
 // aStream := TMemoryStream.Create;  //此处,不需要初始化流
  try
    SetLength(Result, aStream.Size);
    aStream.Position := 0;
    aStream.Read(Result[0], aStream.Size);
  finally
    aStream.Free;
  end;
end;




///将Bitmap位图转化为base64字符串
function BitmapToString(FileName:string):string ;
var
  ms:TMemoryStream;
  ss:TStringStream;
  s:string;
begin
    ms := TMemoryStream.Create;
    ms.LoadFromFile(FileName);
    ss := TStringStream.Create;
    ms.Position:=0;
    EncodeStream(ms,ss);//将内存流编码为base64字符流
    s:=ss.DataString;
    s := StringReplace(s, #13, '', [rfReplaceAll]);  // 这里m2中数据会自动添加回车换行,所以需要将回车换行替换成空字符
    s := StringReplace(s, #10, '', [rfReplaceAll]);
    ms.Free;
    ss.Free;
    result:=s;
end;




///将base64字符串转化为Bitmap位图
function StringToBitmap(imgStr:string):TBitmap;
var ss:TStringStream;
    ms:TMemoryStream;
    bitmap:TBitmap;
begin
    ss := TStringStream.Create(imgStr);
    ms := TMemoryStream.Create;
    DecodeStream(ss,ms);//将base64字符流还原为内存流
    ms.Position:=0;
    bitmap := TBitmap.Create;
    bitmap.LoadFromStream(ms);
    ss.Free;
    ms.Free;
    result :=bitmap;
end;


function BaseImage(fn: string): string;
var
  m1: TMemoryStream;
  m2: TStringStream;
  str: string;
begin
  m1 := TMemoryStream.Create;
  m2 := TStringStream.Create;
  m1.LoadFromFile(fn);
  EncodeStream(m1, m2);                       // 将m1的内容Base64到m2中
  str := m2.DataString;
  str := StringReplace(str, #13, '', [rfReplaceAll]);  // 这里m2中数据会自动添加回车换行,所以需要将回车换行替换成空字符
  str := StringReplace(str, #10, '', [rfReplaceAll]);
  result := str;                                       // 返回值为Base64的Stream
  m1.Free;
  m2.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin


  //  Memo1.Lines.Add(BaseImage(OpenDialog1.FileName));


    Memo1.Lines.Add(BitmapToString(OpenDialog1.FileName))
  end;
end;


end.