【发布时间】:2013-10-18 17:47:04
【问题描述】:
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();
我在我的机器上运行它,bytes.Length 是 8587,在我其他开发人员的机器上它是 2009。据说在.NET 中没有办法影响PNG 压缩的质量(或者更确切地说是这种情况下的比率)。这个特定的图像是空白的,我有其他测试可以处理带有内容的图像,它们确认压缩是无损的(我遇到了一些争论,这是一个问题)。
但即使压缩是无损的,在压缩算法运行时间 + CPU 利用率与压缩率/质量之间也存在权衡。我想知道System.Drawing.Imaging 如何确定质量,因为上述案例清楚地表明可能存在差异。我如何确定在客户端的机器上它不会选择 100% 的质量(这将产生 1.457.337 大小的文件)?
相关资料:
- PNG Compression in .net
- C# - How to change PNG quality or color depth
- save png image with custom quality or color depth in C#
- http://bytes.com/topic/c-sharp/answers/700494-how-specify-compression-level-when-saving-loseless-pngs
附加信息:
- 检查了另一个开发者的机器,和我其他同事的结果一致,所以我的机器是异常值。
- 每台机器上都安装了 Win 7 Prof 64 位,特定测试是 NUnit,我们使用的是 .NET 4
- 我安装的任何软件都可以在这方面覆盖 .NET 的行为吗?例如,我安装了 IrfanView,它可以替换任何系统范围的“过滤器”或使用的 dll 吗? (顺便说一句,我在 Modules 调试视图中检查了,我没有看到任何异常的 dll 加载)
- 它会受到某些 Windows 操作系统桌面质量设置或其他因素的影响吗?
【问题讨论】:
-
您说您保存了 PNG,但您的代码使用的是 BMP...
-
@TrevorElliott 我复制了错误的测试代码,已更正。
-
如果您切换到无损压缩,那么在任何东西和质量之间进行权衡是什么意思?无损压缩的全部意义在于压缩前和解压缩后的图像是逐位相同的。没有质量损失,除非算法被破坏或者你故意丢弃它。
-
@cHao 好吧,通常质量和压缩比是相同的设置(它们相互影响)。人们经常提到质量,在我们的例子中,我们更应该谈论压缩比。即使在无损压缩的情况下,编解码器的编码器算法的工作也是努力在整个过程中找到最佳参数。我会更正这个问题。
标签: c# png image-compression image-quality