如何将INI文件中的base64编码数据加载到TPicture?

在Delphi 10.4中,我成功TPicture使用以下代码将有效的base64编码保存到INI文件中:


 procedure TForm1.SavePictureToIniFile(const APicture: TPicture);
// https://stackoverflow.com/questions/63216011/tinifile-writebinarystream-creates-exception
var
   LInput: TMemoryStream;
   MyIni: TMemIniFile;
   Base64Enc: TBase64Encoding;
   ThisFile: string;
begin
   if FileSaveDialog1.Execute then
    ThisFile := FileSaveDialog1.FileName
   else EXIT;

   //CodeSite.Send('TForm1.btnSaveToIniClick: VOR Speichern');
   LInput := TMemoryStream.Create;
   try
    APicture.SaveToStream(LInput);
    LInput.Position := 0;
    MyIni := TMemIniFile.Create(ThisFile);
    try
      Base64Enc := TBase64Encoding.Create(Integer.MaxValue, '');
      try
        MyIni.WriteString('Custom', 'IMG', Base64Enc.EncodeBytesToString(LInput.Memory, LInput.Size));
      finally
        Base64Enc.Free;
      end;
      MyIni.UpdateFile;
    finally
      MyIni.Free;
    end;
   finally
    LInput.Free;
   end;
   //CodeSite.Send('TForm1.btnSaveToIniClick: NACH Speichern'); // 0,024 Sek.
end;



现在,我想逆转此过程,即将数据从INI文件加载回到TPicture


INI文件的数据是二进制映像的Base64表示形式,即string因此,您需要读取此Base64字符串,然后使用将其转换为二进制Blob Base64Enc

但是您的代码使用该ReadBinaryStream方法,该方法不将文本视为Base64字符串而是十六进制字节序列,并将其作为二进制Blob返回,然后将其提供给Base64Enc

而应该这样做:


 var
   ImgData: TBytes;
begin
   MyIni := TMemIniFile.Create('D:\img.ini');
   try
    Base64Enc := TBase64Encoding.Create(Integer.MaxValue, '');
    try
      LInput := TMemoryStream.Create;
      try
        ImgData := Base64Enc.DecodeStringToBytes(MyIni.ReadString('Custom', 'IMG', ''));
        LInput.WriteData(ImgData, Length(ImgData));
        LInput.Position := 0;
        ThisPicture := TPicture.Create;
        try
          ThisPicture.LoadFromStream(LInput);
          // Use ThisPicture
        finally
          ThisPicture.Free;
        end;
      finally
        LInput.Free;
      end;
    finally
      Base64Enc.Free;
    end;
   finally
    MyIni.Free;
   end;






联系电话:
020-00000000
联系电话:
020-00000000
联系电话:
020-12345678