解码JPEG文件时的跨浏览器不兼容性?

7
有件事让我感到困惑-为什么这张图片在每个浏览器中看起来都不同?
在IE9(和Windows照片查看器)中的图像:
Image in IE9 在Firefox(和Photoshop)中的图像:
Image in Firefox
在Chrome(和Irfanview)中的图像:
Image in Chrome
它们的JPEG解码过程是如何使最终输出如此不同的呢?
(在IE,Firefox,Chrome等浏览器中查看以了解我的意思。)

现在在Chrome中看起来有些不同 ;) - Joey
4个回答

6

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...

2

JPEG可以使用RGB或CMYK编码。当它是CMYK时,通常会出现这些问题。在图像编辑程序中打开文件并将其保存为RGB JPEG,向CMYK打印机致敬,现在你将在浏览器中先前拥有的不同结果。


根据Photoshop的显示,这个看起来是以RGB编码。 - Isaac Zigzag
无论如何,将其复制粘贴到新图像中并保存。这可能会解决您的问题。如果不行,请尝试另一个图形程序。 - Stefan Steiger
没关系,这不是问题,只是好奇心而已 :) 虽然谢谢你的回答! - Isaac Zigzag

1

我只是猜测。
如果这个图像是为了显示这些差异而创建的,那么它可能不是一个正常的图像被编码,而是一个无效的图像,其中计算出的颜色超出了0到255范围,不同的解码器处理这些情况的方式也不同。


考虑到它似乎显示了非常有限的颜色范围,并区分了8x8块中的单个像素,这似乎是有道理的。 - Isaac Zigzag

1
如果您在Photoshop中将特定图像的颜色配置文件从CMYK更改为sRGB,那么它将在所有浏览器中显示得更加均匀。

有趣的是,我不知道这会有所不同。但是,Photoshop 报告说这张图片是 RGB 色彩空间而不是 CMYK。 - Isaac Zigzag
当我第一次下载你的图片(http://imgur.com/UNZTe.jpg)时,我发誓在我的Photoshop中它是CMYK格式的 :-)。如果你保存它并在浏览器中测试,它会再次正常显示。PS:我的答案似乎与Quandary的答案相似,而他的回答比我早了5分钟。 - bogatyrjov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接