从inifile加载png图像的问题

S.F*_*TEH 1 delphi ini png

我使用以下代码将PNG图像存储到Ini文件中:

procedure TfrmParametres.SaveIni;
var
  IniFile: TIniFile;
  MS: TMemoryStream;
  PNG: TPngImage;
begin
  IniFile := TIniFile.Create(IniFileName);
  try
  PNG := TPngImage.Create;
  try
    PNG.LoadFromFile(edtLogo.Text);//edtlogo contain image file path
    MS  := TMemoryStream.Create;
    try
      PNG.SaveToStream(MS);
      MS.Seek(0, 0);
      IniFile.WriteBinaryStream('REPORT_HEADER', 'LOGO', MS);
    finally
      MS.Free;
    end;
  finally
    PNG.Free;
  end;
finally
  FreeAndNil(IniFile);
end;
end;
Run Code Online (Sandbox Code Playgroud)

并以另一种形式显示图片OnShow事件我使用相同的方法:

  1. 在TMemoryStream对象中加载DATA
  2. 将MemoryStream中的DATA加载到TPngImage对象中
  3. 在TImage组件中显示图片

    procedure TfrmLoadPicture.FormShow(Sender: TObject);
    var
      IniFile: TIniFile;
      MS: TMemoryStream;
      PNG: TPngImage;
    begin
      IniFile:= TIniFile.Create(frmParametres.IniFileName);
      try
        MS:= TMemoryStream.Create;
        try
          IniFile.ReadBinaryStream('REPORT_HEADER', 'LOGO', MS);
          PNG := TPngImage.Create;
          try
            MS.Seek(0, 0);
            PNG.LoadFromStream(MS);
            Image.Picture.Assign(PNG);
          finally
            PNG.Free;
          end;
        finally
          MS.Free;
        end;
      finally
        IniFile.Free;
      end;
    end;
    
    Run Code Online (Sandbox Code Playgroud)

但是我总是得到异常错误: 在此输入图像描述

Chr*_*ton 5

TIniFile有一个硬编码上限,它可以读取任何一个值的大小,部分原因是底层Windows API(GetPrivateProfileString和朋友)不允许查询保存值的大小.IMO TIniFile应该在试图写出更大的值时提出异常,但无论如何,如果你使用TMemIniFile而不是TIniFile你应该没问题(我刚试过).