Delphi 从文件加载png图像时出现问题
我使用以下代码将PNG图像存储到Ini文件中: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
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;
为了在展会上以另一种形式展示图片,我使用了相同的方法:
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)不允许查询保存值的大小。IMOTIniFile
在尝试写入更大的值时确实会引发异常,但无论如何,如果您使用TMemIniFile
而不是TIniFile
,您应该会很好(我刚刚尝试过)。TIniFile
对它可以读取的任何一个值的大小都有一个硬编码上限,部分原因是,底层Windows API(GetPrivateProfileString
和friends)不允许查询保存值的大小。IMOTIniFile
在尝试写入更大的值时确实会引发异常,但无论如何,如果您使用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。