Delphi 正在使用TZCompressionStream截断的数据

Delphi 正在使用TZCompressionStream截断的数据,delphi,compression,Delphi,Compression,我有以下声明: stmCompressor: TZCompressionStream; stmCompressed: TMemoryStream; stmBlob: TStream; 我有以下代码: stmBlob := qry.CreateBlobStream(qry.FieldByName(sFieldName), bmRead); stmCompressed := TMemoryStream.Create; stmCompressor := TZCompressionStream.Cre

我有以下声明:

stmCompressor: TZCompressionStream;
stmCompressed: TMemoryStream;
stmBlob: TStream;
我有以下代码:

stmBlob := qry.CreateBlobStream(qry.FieldByName(sFieldName), bmRead);
stmCompressed := TMemoryStream.Create;
stmCompressor := TZCompressionStream.Create(stmCompressed); 
stmBlob.Position := 0;
stmCompressor.CopyFrom(stmBlob, stmBlob.Size);
stmCompressed.Position := 0;
stmCompressed.SaveToFile('C:\Temp\CompressedData2.zip');
我试图压缩数据库中的图像数据,并将结果放入内存流中。然后我将STM压缩保存到一个文件中,以便检查结果。结果似乎是它应该是的一种截断形式。如果压缩数据大于80000H,则文件将被截断为该大小。如果数据大于B0000H,则文件将被截断到此大小

有趣的是,如果我将stmCompressed从一个TMemoryStream更改为一个TFileStream,那么它就可以完美地工作(代码并不完全相同-如果有帮助的话,我可以发布它)

我需要的结果是在一个内存流,所以我会感谢任何人可以提供任何帮助。我正在使用XE2附带的标准ZLib库


谢谢。

您必须释放TZCompressionStream以将剩余字节刷新到内存流中。

您必须释放TZCompressionStream以将剩余字节刷新到内存流中。

如果在保存文件之前关闭内存流会发生什么?如果您想要ZIP文件,则应使用TZipFile。如果您正在压缩图像,ZIP/zlib可能是一个糟糕的压缩机选择。如果您在SaveToFile之前关闭内存流,会发生什么?如果您想要ZIP文件,那么应该使用TZipFile。如果您正在压缩图像,ZIP/zlib可能是一个糟糕的压缩机选择。非常感谢Uwe,这就是问题所在。非常感谢Uwe,这就是问题所在。