3

何か問題があったかどうかはわかりませんが、.NET フレームワークの最も単純な機能を使用しているときに、Windows 8 に重大な変更があることがわかりました。私のマシンの 1 つは Visual Studio 2010 プレミアムを搭載した Windows 7 X64 で、もう 1 つはまったく同じ 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();
}

Windows 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); // ?
}

2番目のコード部分は、他のシステムでPNG圧縮の違いがある必要があります。1275->ストリームサイズのダウンスイングによって、より適切に判断できる可能性があります。

于 2012-09-03T07:58:42.660 に答える