我需要一种在.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();
}