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

发布于 2024-09-27 12:32:33 字数 489 浏览 6 评论 0原文

有些事情让我感到困惑 - 为什么此图像在每个浏览器中显示不同?

IE9(和 Windows 照片查看器)中的图像:
IE9 中的图像

Firefox(和 Photoshop)中的图像:
Firefox 中的图像

Chrome(和 Irfanview)中的图像:
Chrome 中的图像

他们的 JPEG 解码过程中发生了什么,导致最终输出如此不同?

(在 IE、Firefox、Chrome 等浏览器中查看即可明白我的意思。)

Something is puzzling me - why does this image appear different in every browser?

Image in IE9 (and Windows Photo Viewer):
Image in IE9

Image in Firefox (and Photoshop):
Image in Firefox

Image in Chrome (and Irfanview):
Image in Chrome

What is going on in their decoding processes of the JPEG to make the eventual output so different?

(View it in IE, Firefox, Chrome, etc. to see what I mean.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

浪漫之都 2024-10-04 12:32:33

JPEGSnoop(来源现在可用@sourceforge)在我们到达 Y'CbCr 之前就报告了大的亮度溢出到 RGB 转换。我在其他一些文件上遇到这些错误,但溢出通常很小 - 256 或 257,而最大值为 255。此处计算的亮度为 729!

JPEGSnoop 作者对 YCC 溢出的评论:

DC 中的 YCC 削波 - 每个 MCU 添加或
从 DC(平均)值中减去
在之前的MCU中。这些都应该
保持在 8 位范围内,但是
DC 系数的损坏可能
导致这个值偏离
范围。此类错误会导致
颜色突然大幅变化或
图像的亮度。作为这种类型
错误一般不会恢复,
JPEGsnoop 只会报告第一个
其中 10 个在日志文件中。

我对跨 MCU DC 并不熟悉,但 Pennebaker &米切尔同意

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

JPEGSnoop (source now available @ sourceforge) reports large luma overflow before we even get to Y'CbCr to RGB conversion. I get these errors on some other files, but the overflow is typically small- 256 or 257 vs. a max of 255. The luma calculated here is 729!

JPEGSnoop's author's comments on YCC overflow:

YCC clipping in DC - Each MCU adds or
subtracts from the DC (average) value
in the previous MCU. These should all
stay within an 8-bit range, but
corruption in the DC coefficient may
cause this value to wander out of
range. This type of error will cause
sudden large-scale changes in color or
brightness in your image. As this type
of error generally won't recover,
JPEGsnoop will only report the first
10 of these in the log file.

I wasn't familiar with the inter-MCU DC, but Pennebaker & Mitchel concur.

*** 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...
傲性难收 2024-10-04 12:32:33

JPEG 可以用 RGB 或 CMYK 进行编码。这些细节通常在 CMYK 时出现。在图像编辑程序中打开文件并将其另存为 RGB JPEG,然后向 CMYK 打印机致敬,它们现在将具有与您之前在浏览器中看到的不同结果。

JPEG can be encoded in RGB or CMYK. These nicities usually occur when it's CMYK. Open the file in an image editing program and save it as RGB JPEG, and salute the CMYK printers, which will now have the different results you previously had in the browser.

嘿嘿嘿 2024-10-04 12:32:33

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

I'm only guessing.
If the image was created to show these differences perhaps it's not a normal image which was encoded, but an invalid one where the calculated colors are outside of the 0 to 255 range and different decoders handle these differently.

拥抱我好吗 2024-10-04 12:32:33

例如,如果您在 Photoshop 中将该特定图像的颜色配置文件从 CMYK 更改为 sRGB,则它在所有浏览器中的显示效果或多或少会相同。

If you change the color profile of that particular image from CMYK to sRGB in Photoshop, for instance, it will appear more or less equally in all browsers.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文