我使用以下代码将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;为了在另一种形式的OnShow事件中显示图片,我使用了相同的方法:
但是,我总是得到异常错误:

发布于 2014-12-21 16:57:22
TIniFile对它可以读取的任何一个值的大小都有一个硬编码上限,部分原因是底层的Windows (GetPrivateProfileString和朋友)不允许查询保存值的大小。IMO TIniFile确实应该在尝试编写更大的值时引发一个例外,但是无论如何,如果您使用TMemIniFile而不是TIniFile,您应该会很好(我刚刚尝试过)。
发布于 2014-12-21 17:49:55
克里斯回答了你直接问的问题。我还有其他的评论。
不需要对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文件从未被用于存储大型二进制blobs。在第一次检查时,您试图将PNG图像塞进INI文件中,这似乎很奇怪。
https://stackoverflow.com/questions/27591371
复制相似问题