Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 从文件加载png图像时出现问题_Delphi_Png_Ini - Fatal编程技术网

Delphi 从文件加载png图像时出现问题

Delphi 从文件加载png图像时出现问题,delphi,png,ini,Delphi,Png,Ini,我使用以下代码将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);//edt

我使用以下代码将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;
为了在展会上以另一种形式展示图片,我使用了相同的方法:

  • 在TMemoryStream对象中加载数据

  • 将数据从MemoryStream加载到TPngImage对象中

  • 在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;
    
  • 但是,我总是遇到异常错误:
    TIniFile
    对它可以读取的任何一个值的大小都有一个硬编码上限,部分原因是底层Windows API(
    GetPrivateProfileString
    和friends)不允许查询保存值的大小。IMO
    TIniFile
    在尝试写入更大的值时确实会引发异常,但无论如何,如果您使用
    TMemIniFile
    而不是
    TIniFile
    ,您应该会很好(我刚刚尝试过)。

    TIniFile
    对它可以读取的任何一个值的大小都有一个硬编码上限,部分原因是,底层Windows API(
    GetPrivateProfileString
    和friends)不允许查询保存值的大小。IMO
    TIniFile
    在尝试写入更大的值时确实会引发异常,但无论如何,如果您使用
    TMemIniFile
    而不是
    TIniFile
    ,您应该会没事(我刚刚尝试过)。

    Chris已经回答了您提出的直接问题。我还有其他一些意见

    无需解码PNG以将其传输到INI文件

    您可以直接复制文件,而无需解码PNG,然后重新编码

    Stream := TFileStream.Create(FileName, fmOpenRead);
    try
      IniFile.WriteBinaryStream('REPORT_HEADER', 'LOGO', Stream);
    finally
      Stream.Free;
    end;
    
    十六进制编码效率不高

    WriteBinaryStream
    不是将二进制编码为文本的非常有效的方法。实际上,您使用的是base16,使用base64将更加传统和高效

    我建议您将二进制文件流编码为base64字符串,并将该字符串写入INI文件

    INI文件不适合二进制数据


    INI文件从未打算用于存储大型二进制blob。第一次检查时,您试图将PNG图像转换为INI文件似乎有些奇怪

    克里斯已经回答了你提出的直接问题。我还有其他一些意见

    无需解码PNG以将其传输到INI文件

    您可以直接复制文件,而无需解码PNG,然后重新编码

    Stream := TFileStream.Create(FileName, fmOpenRead);
    try
      IniFile.WriteBinaryStream('REPORT_HEADER', 'LOGO', Stream);
    finally
      Stream.Free;
    end;
    
    十六进制编码效率不高

    WriteBinaryStream
    不是将二进制编码为文本的非常有效的方法。实际上,您使用的是base16,使用base64将更加传统和高效

    我建议您将二进制文件流编码为base64字符串,并将该字符串写入INI文件

    INI文件不适合二进制数据


    INI文件从未打算用于存储大型二进制blob。第一次检查时,您试图将PNG图像转换为INI文件似乎有些奇怪

    你的照片有多大?TIniFile.ReadString最多读取2048个字符。我没有使用ReadString,而是使用ReadBinaryStream!您的意思是我需要设置内存流的大小吗?ReadBinaryStream使用ReadString。您的图片的大小是多少?TIniFile.ReadString最多读取2048个字符。我没有使用ReadString,而是使用ReadBinaryStream!您的意思是我需要设置内存流的大小吗?ReadBinaryStream使用ReadString。