我处理了大量单色图像数据,今天早上我注意到 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个灰色阴影渲染的那样。
有谁知道更多关于这一点,它走了多远以及可能有什么好的解决方法?