3

我不确定我是否做错了什么,但当我在 .NET 框架中使用一些最简单的功能时,我发现 Windows 8 发生了重大变化。我的一台机器是带有 Visual Studio 2010 高级版的 Windows 7 X64,另一台是带有完全相同的 Visual Studio 的 Windows 8 X64。Win7 / Win8 系统都是作为 MSDN 订阅者下载的,所以它们都是官方的。但是对于以下代码:

static void Main(string[] args)
{
    byte[] dataBytes = new byte[256 * 256 * 4 + 256];
    MemoryStream resultStream = new MemoryStream();
    DeflateStream deflateStream = new DeflateStream(resultStream, CompressionMode.Compress);
    deflateStream.Write(dataBytes, 0, dataBytes.Length);
    Console.WriteLine(resultStream.Length);//2330

    Bitmap a = new Bitmap(256, 256);
    MemoryStream memoryStream1 = new MemoryStream();
    a.Save(memoryStream1, ImageFormat.Png);
    byte[] byteArray1 = memoryStream1.ToArray();
    Console.WriteLine(byteArray1.Length);//1275

    Console.Read();
}

它在 Window 7 上返回 2330/1275,但在 Windows 8 上返回 0/384。代码相同,都在 .NET Framework 4 Client Profile 下。

所以我做错了什么,或者它是 Windows 8 上的重大变化?

首先十分感谢。


感谢您的所有帮助。对于第一种情况,我尝试了以下代码

        byte[] dataBytes = new byte[256 * 256 * 4 + 256];
        MemoryStream resultStream = new MemoryStream();
        DeflateStream deflateStream = new DeflateStream(resultStream, CompressionMode.Compress);
        deflateStream.Write(dataBytes, 0, dataBytes.Length);
        deflateStream.Close();
        Console.WriteLine(resultStream.ToArray().Length);

我在 Windows7 上得到 2338,在 Windows8 上得到 271。因此,Windows 8 似乎确实做了一些优化以使结果流更小。

4

1 回答 1

2

您应该关闭并处置压缩器流,以确保它已将所有数据写入底层流。

在两个系统上尝试这个:

byte[] dataBytes = new byte[256 * 256 * 4 + 256];

using(MemoryStream resultStream = new MemoryStream())
{
    using(DeflateStream deflateStream = new DeflateStream(resultStream, CompressionMode.Compress)
        deflateStream.Write(dataBytes, 0, dataBytes.Length);

    Console.WriteLine(resultStream.Length); // ?
}

第二个代码部分必须在其他系统上有 PNG 压缩差异。从 1275 -> 流大小下降趋势来看,可能工作得更好。

于 2012-09-03T07:58:42.660 回答