.net에서 이미지를 압축 할 필요가있어서 .net GZipStream 클래스 (또는 DeflateStream)를 사용하여 보았습니다. 그러나 나는 감압이 항상 성공하지 못한다는 것을 알았고 때로는 이미지가 잘 풀리고 다른 시간에 GDI + 오류가 발생하여 무언가가 손상되었다.GZipStream 그리고 DeflateStream은 모든 바이트를 압축 해제하지 않습니다
문제를 조사한 후 압축을 풀면 압축 된 모든 바이트가 반환되지 않는 것으로 나타났습니다. 그래서 2257974 바이트를 압축하면 2257870 바이트 (실수) 만 반환됩니다.
가장 재미있는 점은 가끔 작동한다는 것입니다. 그래서 나는 단지 10 바이트 만 압축하는이 작은 테스트 방법을 만들었지 만 이제는 아무것도 얻지 못합니다.
압축 클래스 GZipStream과 DeflateStream을 사용하여 시도했는데 가능한 코드를 두 번 확인했습니다. 심지어 스트림을 0으로 배치하고 모든 스트림을 플러시하려했지만 운이 없었습니다. 당신은 압축 할 모든 데이터를 추가 한 후 Close()
ZipStream
필요
public static void TestCompression()
{
byte[] test = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
byte[] result = Decompress(Compress(test));
// This will fail, result.Length is 0
Debug.Assert(result.Length == test.Length);
}
public static byte[] Compress(byte[] data)
{
var compressedStream = new MemoryStream();
var zipStream = new GZipStream(compressedStream, CompressionMode.Compress);
zipStream.Write(data, 0, data.Length);
return compressedStream.ToArray();
}
public static byte[] Decompress(byte[] data)
{
var compressedStream = new MemoryStream(data);
var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress);
var resultStream = new MemoryStream();
var buffer = new byte[4096];
int read;
while ((read = zipStream.Read(buffer, 0, buffer.Length)) > 0) {
resultStream.Write(buffer, 0, read);
}
return resultStream.ToArray();
}
댓글을 다시 작성하십시오. - 다양한 레벨의 버퍼로 제공됩니다. 그들이 모두 비운 것이 아니라면 (올바른 순서로) 비어있는 경우 모든 데이터를 얻지 못합니다. –
예를 들어, MemoryStream 자체에서 Close()를 호출하는 것에 신경 쓰지 않았다는 점에 유의하십시오 .- 부분적으로 동의합니다 .-p –
이것에 대한 업데이트도 추가하겠습니다 .... –