.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();
}