c# DeflateSream return 0;

c# DeflateSream return 0;

我正在尝试使用 Defltestream 压缩图像,但不知何故,当我尝试打印 return 缓冲区长度时,它始终为 0。

public void goo()
{
    MemoryStream ms = new MemoryStream();
    MemoryStream ms2 = new MemoryStream();
    Bitmap prev;

    prev = GetDesktopImage();
    prev.Save(ms,ImageFormat.Png);
    prev.Save(ms2, ImageFormat.Png);
    com = ms.ToArray();
    MessageBox.Show((com.Length / 1000).ToString() + "KB");
    MessageBox.Show(((Compress(ms2).Length/1000).ToString()+"KB"));
}

GetDesktopImage 是一个 return 截图的功能。在第一个消息框中它显示长度(例如输出是:“350kb”),但在第二个消息框中它总是 0kb!

这是压缩方法:

private static byte[] Compress(Stream input)
{
    using (var compressStream = new MemoryStream())
        using (var compressor = new DeflateStream(compressStream, CompressionMode.Compress))
        {
            input.CopyTo(compressor);
            compressor.Close();
            return compressStream.ToArray();
        }
}

有谁知道为什么我总是得到 0?

我认为它显示为零,但该值不是零。当您除以整数或整数除以数字时,结果始终是整数。当整数的值为十进制时,它会将值转换为非十进制数(舍入)。

示例:

int number = 25;`
return number / 2;

结果将是 13,因为该值是 12.5,它通过四舍五入变成了整数值,得到 13

当您将内容写入流(或在您的情况下保存)时,其内部位置会相应增加。

所以正如 Lasse V. Karlsen 所说,你应该倒回流

m.Position = 0;

m.Seek(0, SeekOrigin.Begin)

让读者从位置0开始阅读。

Bitmap b = new Bitmap(100, 100);
var m = new MemoryStream();
b.Save(m, ImageFormat.Png);
Console.WriteLine(m.Position); // will output 169