我有一个用zlib压缩的tiff图像,但它们在文件的开头粘贴了4个字符的标识符。
我想开始在5位读取文件,跳过前4个字符,然后解压缩。
我修改了以下代码,但当它到达“LOutput.CopyFrom”行时,它告诉我DataError。
procedure TForm1.DecompressXE3 ;
var
LInput, LOutput: TFileStream;
LUnZip: TZDecompressionStream;
FSize : int64 ;
begin
{ Create the Input, Output, and Decompressed streams. }
LInput := TFileStream.Create(edtDecompressSrcFile.Text, fmOpenRead);
FSize := LInput.Size ;
LInput.Position := 5 ;
LOutput := TFileStream.Create(ChangeFileExt(edtDecompressSrcFile.Text, '.tiff'), fmCreate);
LUnZip := TZDecompressionStream.Create(LInput);
{ Decompress data. }
LOutput.CopyFrom(LUnZip, FSize-4 );
// LOutput.CopyFrom(LUnZip, 0 );
{ Free the streams. }
LUnZip.Free;
LInput.Free;
LOutput.Free;
end;
答案 0 :(得分:5)
排名从零开始,因此您必须设置LInput.Position := 4;
跳过4个字节。
潜在的错误原因 - TZDecompressionStream可能会使用整个输入流,忽略位置设置,因此额外的启动字节会中断解压缩过程。在这种情况下,您最好将文件的有效部分复制到中间MemoryStream,并将其作为TZDecompressionStream.Create的输入参数提供。
请注意,您正在使用FSize - 压缩文件的大小 - 从解压缩流进行复制。你应该使用
LOutput.CopyFrom(LUnZip, 0);
or
LOutput.CopyFrom(LUnZip, LUnZip.Size);