12

我处理了大量单色图像数据,今天早上我注意到 libjpeg 和 .Net jpeg 编解码器处理单色数据的方式似乎存在显着差异。似乎使用 libjpeg 以任何质量设置保存并使用默认的 .Net jpeg 编解码器打开的单色图像实际上只加载了 16 种不同的灰色阴影,并且所有中间阴影都被渲染为点画。

这是由 libjpeg 保存并由 .net 加载的平滑渐变的直方图

编解码器冲突影响梯度的直方图

直方图应该是完全水平的。

这是渐变的(放大)示例(它应该是完美平滑的过渡) 在此处输入图像描述

这应该是从左侧的灰色 85 到右侧的灰色 136 的平滑过渡,但实际上只渲染了 4 种灰度来进行过渡。

我的问题是我疯了,如果不是这个编解码器差异有多远?如果您在不同的程序中同时使用这两个库,有没有好的解决方法?

我没有责怪任何一个编解码器,只是指出了似乎存在差异的地方。我注意到我知道是使用 libjpeg 创建的图像,认为这是质量设置问题,尝试使用 faststone image resizer 创建测试图像并得到相同的结果,尝试使用 irfanview 并再次得到相同的结果。由于这两个程序都必须使用一些 jpeg 库,我倾向于假设它们也在使用 libjpeg,并且存在真正的编解码器冲突。

在加载方面,我使用我自己的 .net 代码和 Paint.net 加载图像时遇到了相同的结果。

最后,这是一个正常分辨率的示例,您可以下载并自己尝试。在某些程序中加载它会给你一个很好的渐变(例如你的浏览器),但是用你自己的.Net代码加载它,或者Paint.Net会给你一个抖动的渐变,就像上面只使用16个灰色阴影渲染的那样。

在此处输入图像描述

有谁知道更多关于这一点,它走了多远以及可能有什么好的解决方法?

4

1 回答 1

4

我可以通过在与 Windows 7 捆绑的 Paint 版本中打开您的示例图像来重现您的症状。分析文件显示它是一个有效的 JPEG,并让它在浏览器中正确显示证实了这一点。看来微软真的搞砸了。它已经作为错误提交:

https://connect.microsoft.com/VisualStudio/feedback/details/597657/grayscale-jpeg-image-read-as-format8bppindexed-but-quantized-as-format4bppindexed#details

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/9132e2bd-23cc-4e5a-a783-1fa4abe11624/

解决方法是将您的 JPEG 创建为全彩色图像,但仅将灰度像素值放入其中。

于 2011-05-13T15:36:46.060 回答