有些事情让我感到困惑 - 为什么这张图片在每个浏览器中看起来都不一样?
IE9(和 Windows 照片查看器)中的图像:
Firefox(和 Photoshop)中的图像:
Chrome(和 Irfanview)中的图像:
他们的 JPEG 解码过程中发生了什么使最终输出如此不同?
(在 IE、Firefox、Chrome 等中查看它以了解我的意思。)
有些事情让我感到困惑 - 为什么这张图片在每个浏览器中看起来都不一样?
IE9(和 Windows 照片查看器)中的图像:
Firefox(和 Photoshop)中的图像:
Chrome(和 Irfanview)中的图像:
他们的 JPEG 解码过程中发生了什么使最终输出如此不同?
(在 IE、Firefox、Chrome 等中查看它以了解我的意思。)
JPEGSnoop(现在可以使用@sourceforge 的源代码)在我们进行 Y'CbCr 到 RGB 转换之前报告了大的亮度溢出。我在其他一些文件上遇到了这些错误,但溢出通常很小 - 256 或 257 而最大为 255。这里计算的亮度是 729!
JPEGSnoop 的作者对 YCC 溢出的评论:
DC 中的 YCC 削波 - 每个 MCU 在前一个 MCU 中添加或减去 DC(平均值)值。这些都应该保持在 8 位范围内,但 DC 系数的损坏可能会导致该值超出范围。此类错误会导致图像颜色或亮度突然发生大规模变化。由于这种类型的错误通常不会恢复,JPEGsnoop 只会在日志文件中报告前 10 个错误。
我不熟悉跨 MCU DC,但 Pennebaker & Mitchel同意。
*** Decoding SCAN Data ***
OFFSET: 0x00000160
Scan Decode Mode: Full IDCT (AC + DC)
Scan Data encountered marker 0xFFD9 @ 0x00027CA9.0
*** NOTE: YCC Clipped. MCU=( 0, 0) YCC=( 729, 109, 171) Y Overflow @ Offset 0x00027CA8.2
*** NOTE: YCC Clipped. MCU=( 0, 0) YCC=( 682, 109, 172) Y Overflow @ Offset 0x00027CA8.2
*** NOTE: YCC Clipped. MCU=( 0, 0) YCC=( 741, 109, 173) Y Overflow @ Offset 0x00027CA8.2
*** NOTE: YCC Clipped. MCU=( 0, 0) YCC=( 629, 109, 174) Y Overflow @ Offset 0x00027CA8.2
*** NOTE: YCC Clipped. MCU=( 0, 0) YCC=( 841, 109, 175) Y Overflow @ Offset 0x00027CA8.2
*** NOTE: YCC Clipped. MCU=( 0, 0) YCC=( 319, 109, 176) Y Overflow @ Offset 0x00027CA8.2
*** NOTE: YCC Clipped. MCU=( 0, 0) YCC=( 928, 109, 177) Y Overflow @ Offset 0x00027CA8.2
*** NOTE: YCC Clipped. MCU=( 0, 0) YCC=( 624, 109, 177) Y Overflow @ Offset 0x00027CA8.2
*** NOTE: YCC Clipped. MCU=( 1, 0) YCC=( 785, 107, 171) Y Overflow @ Offset 0x00027CA8.2
*** NOTE: YCC Clipped. MCU=( 1, 0) YCC=( 559, 107, 171) Y Overflow @ Offset 0x00027CA8.2
Only reported first 10 instances of this message...
JPEG 可以用 RGB 或 CMYK 编码。这些细节通常发生在 CMYK 时。在图像编辑程序中打开文件并将其另存为 RGB JPEG,然后向 CMYK 打印机致敬,它现在将获得与之前在浏览器中不同的结果。
我只是猜测。
如果创建图像以显示这些差异,则它可能不是经过编码的正常图像,而是计算颜色超出 0 到 255 范围且不同解码器处理这些差异的无效图像。
例如,如果您在 Photoshop 中将该特定图像的颜色配置文件从 CMYK 更改为 sRGB,它在所有浏览器中的显示或多或少都是相同的。