什么影响C#PNG无损压缩率?

Csa*_*oth 2 c# png image-compression image-quality

Bitmap clip = new Bitmap((int)(8.5 * 72), (int)(11 * 72));
MemoryStream stream = new MemoryStream();
clip.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
byte[] bytes = stream.ToArray();
Run Code Online (Sandbox Code Playgroud)

我跑了它在我的机器上,并且bytes.Length8587,我的同事开发的机器是2009.据说,.NET没有办法影响PNG压缩的质量(或者说这种情况下的比率).这个特殊的图像是空白的,我还有其他测试与内容图像一起工作,他们确认压缩是无损的(我遇到了一些争论,这是一个问题).

但即使压缩是无损的,压缩算法运行时间+ CPU利用率与压缩率/质量之间也需要权衡.我想知道如何System.Drawing.Imaging确定质量,因为上述情况清楚地表明可能存在差异.我怎么能确定在客户的机器上它不会选择100%的质量(这将产生1.457.337大小的文件)?

相关材料:

附加信息:

  • 检查了另一个开发人员的机器,它与我的其他同事的结果一致,所以我的机器是异常值.
  • 每台机器都安装了Win 7 Prof 64位,特定的测试是NUnit,我们使用的是.NET 4
  • 在这方面,我安装的任何软件都可以覆盖.NET的行为.例如我安装了IrfanView,它可以替换任何系统范围的"过滤器"或使用的dll吗?(顺便说一下,我查看了模块调试视图,我没有看到任何异常的dll加载)
  • 它可以受到某些Windows操作系统桌面质量设置的影响吗?

小智 7

我一直在追逐这个问题,并在我的两台机器上得到与你完全相同的结果.我相信我已将它跟踪到两台机器上不同版本的System.IO.Compression.DeflateStream - png使用deflate作为其压缩方法,并且似乎使用此类.

当我运行以下内容时:

byte[] blank = new byte[1000000];
MemoryStream uncstream = new MemoryStream(blank);
MemoryStream compstream = new MemoryStream();
DeflateStream defstream = new DeflateStream(compstream, CompressionMode.Compress);
uncstream.CopyTo(defstream);
defstream.Close();
byte[] bytes = compstream.ToArray();
System.Console.WriteLine(bytes.Length);
Run Code Online (Sandbox Code Playgroud)

我在一台机器上获得985字节,在另一台机器上获得8806字节.

如果我将构造函数更改为:

DeflateStream defstream = new DeflateStream(compstream, CompressionLevel.Optimal);
Run Code Online (Sandbox Code Playgroud)

我在第一台机器上得到相同的结果,在第二台机器上得到一个未实现的异常,表明它使用的是早期版本的压缩库.当我在第二台机器上搜索System.IO.Compression.dll时,我根本找不到它,即使安装了.Net 4.我猜它隐藏在.Net 2.0的某个地方.我知道MS声称在.Net的第2版和第4版之间改进了DeflateStream - 请参阅此处进行讨论:

http://www.virtualdub.org/blog/pivot/entry.php?id=335

我也看到它说单独的压缩dll在.Net 4.5中开始生效,虽然我不知道这是否正确.我的下一步是在第二台机器上安装.Net 4.5以查看它是否有所作为,但这必须等到我1月份回到办公室.