我需要一种在 .net 中压缩图像的方法,所以我研究了使用 .net GZipStream 类(或 DeflateStream)。但是我发现解压并不总是成功的,有时图像会很好地解压,有时我会得到一个 GDI+ 错误,表明某些东西已损坏。
在调查了这个问题后,我发现解压缩并没有返回它压缩的所有字节。因此,如果我压缩了 2257974 字节,我有时只会返回 2257870 字节(实数)。
最有趣的是,有时它会起作用。所以我创建了这个只压缩 10 个字节的小测试方法,现在我什么也拿不回来。
我用压缩类 GZipStream 和 DeflateStream 都试过了,我仔细检查了我的代码是否有可能的错误。我什至尝试将流定位到 0 并刷新所有流,但没有运气。
这是我的代码:
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();
}