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

什么会影响C#PNG无损压缩比?,c#,png,image-compression,image-quality,C#,Png,Image Compression,Image Quality,我在我的机器上运行它,bytes.Length是8587,在我的开发伙伴机器上是2009。据推测,在.NET中,无法影响PNG压缩的质量(或者更确切地说是比率)。这个特定的图像是空白的,我还有其他的测试,这些测试使用的是有内容的图像,它们确认压缩是无损的(我遇到了一些争论,这是一个问题) 但即使压缩是无损的,压缩算法运行时+CPU利用率与压缩比/质量之间也存在权衡。我想知道System.Drawing.Imaging是如何决定质量的,因为上面的例子清楚地表明可能存在差异。我如何确保在客户机上不会

我在我的机器上运行它,
bytes.Length
8587
,在我的开发伙伴机器上是
2009
。据推测,在
.NET
中,无法影响PNG压缩的质量(或者更确切地说是比率)。这个特定的图像是空白的,我还有其他的测试,这些测试使用的是有内容的图像,它们确认压缩是无损的(我遇到了一些争论,这是一个问题)

但即使压缩是无损的,压缩算法运行时+CPU利用率与压缩比/质量之间也存在权衡。我想知道
System.Drawing.Imaging
是如何决定质量的,因为上面的例子清楚地表明可能存在差异。我如何确保在客户机上不会选择100%的质量(这将生成1.457.337大小的文件)

相关材料:

其他信息:

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

您可能安装了不同的.NET framework更新

按此检查:

您也可能有不同的.NETFramework 4“发行版”

  • 客户资料
  • 延伸
  • 多目标包

你可以用同样的方法检查。

我一直在关注这个问题,在我的两台机器上得到的结果与你的完全相同。我相信我已经在这两台机器上找到了System.IO.Compression.deflatestStream的不同版本——png使用deflate作为其压缩方法,并且似乎使用了这个类

当我运行以下命令时:

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();
我在一台机器上得到985字节,在另一台机器上得到8806字节

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

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


我还看到有人说单独的压缩dll是从.NET4.5开始的,尽管我不知道这是否正确。我的下一步是在第二台机器上安装.Net 4.5,看看它是否有什么不同,但这必须等到我一月份回到办公室。

你说你保存了一个PNG,但你的代码使用的是BMP…@TrevorElliott我复制了错误的测试代码,更正了。如果你切换到无损压缩,在任何东西和质量之间的权衡是什么?无损压缩的全部要点是,预压缩和解压缩后的图像是逐位相同的。没有质量损失,除非算法被破坏或您有意丢弃它。@好吧,通常质量和压缩比是相同的设置(这两个设置相互矛盾)。人们经常提到质量,在我们的例子中,我们更应该谈论压缩比。即使是在无损压缩的情况下,编解码器的编码器算法也会努力在整个过程中找到最佳参数。我会纠正这个问题。我还安装了
MicrosoftWindowsSDK for Windows7
Windows调试工具(x64)
,以及一大堆符号,但我想我的同事们没有。希望我们很快会花一些时间来检查版本。我收集了一些版本信息,但不一致。具体来说,我调试了软件,设置了一个断点,在“模块”窗口中,您可以看到所有DLL的确切版本(包括内部版本号)。所有三台机器的系统图纸相同。其他开发人员中的一个拥有与我几乎相同的构建,而另一个则差异更大。我需要做更多的调查,即使版本是一个指标,问题是为什么或如何?感谢你深入地追踪这一点。我没有时间做那件事。我会仔细检查你的发现,但我相信你的答案是正确的。从我的角度来看,您的发现是好的,因为这意味着默认压缩即使使用“旧”方法也不会恶化到惊人的大(我相信)。还要注意的是,开始提供ZipArchive类的是.NET 4.5。所以很有可能在引擎盖下的压缩区域有发展,这可能会影响这一点。我现在没有时间验证这一点,但我会标记您的答案是正确的。NET4.5(最终)开始使用zLib进行压缩/放气,从而获得更好的压缩比。
DeflateStream defstream = new DeflateStream(compstream, CompressionLevel.Optimal);