Кроссбраузерная несовместимость при декодировании файлов JPEG? - PullRequest
7 голосов
/ 15 октября 2010

Что-то меня озадачивает - почему это изображение выглядит по-разному в каждом браузере?

Изображение в IE9 (и Windows Photo Viewer):
Image in IE9

Изображение в Firefox (и Photoshop):
Image in Firefox

Изображение в Chrome (и Irfanview):
Image in Chrome

Что происходит в их процессах декодирования JPEG, чтобы сделать окончательный вывод таким разным?

(просмотрите его в IE, Firefox, Chrome и т. Д., Чтобы понять, что я имею в виду.)

Ответы [ 4 ]

6 голосов
/ 18 февраля 2011

JPEGSnoop (источник теперь доступен @ sourceforge) сообщает о значительном переполнении яркости еще до того, как мы перейдем к преобразованию Y'CbCr в RGB. Я получаю эти ошибки в некоторых других файлах, но переполнение обычно небольшое - 256 или 257 против максимального значения 255. Рассчитанная здесь яркость равна 729!

Комментарии автора JPEGSnoop к переполнению YCC:

YCC отсечение в DC - каждый MCU добавляет или вычитает из постоянного (среднего) значения в предыдущем MCU. Это должно все оставаться в пределах 8-битного диапазона, но коррупция в коэффициенте постоянного тока может заставить это значение выйти из спектр. Этот тип ошибки приведет к внезапные крупномасштабные изменения в цвете или яркость в вашем изображении. Как этот тип ошибки обычно не восстанавливаются, JPEGsnoop сообщит только о первом 10 из них в файле журнала.

Я не был знаком с DC между MCU, но 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...
2 голосов
/ 15 октября 2010

JPEG может быть закодирован в RGB или CMYK.Эти нюансы обычно происходят, когда это CMYK.Откройте файл в программе для редактирования изображений и сохраните его как RGB JPEG, и поприветствуйте принтеры CMYK, которые теперь будут иметь другие результаты, которые вы ранее имели в браузере.

1 голос
/ 15 октября 2010

Если вы измените цветовой профиль этого конкретного изображения с CMYK на sRGB, например, в Photoshop, оно будет более или менее одинаково отображаться во всех браузерах.

1 голос
/ 15 октября 2010

Я только догадываюсь.
Если изображение было создано для демонстрации этих различий, возможно, это не обычное изображение, которое было закодировано, а недопустимое, где вычисленные цвета находятся вне диапазона от 0 до 255, и разные декодеры обрабатывают их по-разному.

...