суббота, 11 июня 2011 г.

Тайна неподдающегося JPG-файла

Это перевод The Mystery of the Recalcitrant JPG. Автор: Реймонд Чен.

Неправильное расширение может создать массу проблем, особенно если предполагается, что проблемный участок находится в другом месте.

Клиент пожаловался, что их попытка развернуть на всех компьютерах единый фоновый рисунок средствами групповой политики провалилась. Проблемный рисунок представлял собой файл по имени corp.jpg, то есть речь шла о формате, разработанном группой Joint Photographic Experts Group и хорошо известном как JPEG.

Обслуживающий клиента специалист отдела поддержки попытался разобраться с вопросом. Исследование показало, что когда в компании заменили проблемный файл другой JPEG-картинкой, все прошло на ура. Это позволило значительно сузить круг поиска неполадки. Проблема явно была не в развертывании средствами групповых политик или вообще с фоновыми рисунками в формате JPEG. У клиента также случайно не включили политику "Разрешить использование только точечных фоновых рисунков" (Allow only bitmapped wallpaper). Было что-то не так с конкретным JPEG-рисунком. Может он заколдован?

"Я сравнил свойства двух JPEG-рисунков и заметил, что глубина цвета (свойство Bit depth) у них отличается, — сообщил обслуживающий клиента сотрудник. — У клиентской фоновой картинки, той которая "неправильная", глубина цвета 8-разрядная. А у "хорошей" JPEG-картинки глубина 24. Это дефект или все нормально? Если Windows не поддерживает JPEG с восьмиразрядной глубиной цвета, то задокументировано ли это где-нибудь?"

Вообще-то Windows 7 прекрасно работает с фоновыми рисунками в формате JPEG. Есть только ограничение на размер файла: он должен быть не больше 20 Мб. Файлы большего размера сразу отбрасываются. Этот всего лишь мера предосторожности, чтобы вы случайно (или по злому умыслу) не использовали в качестве фонового рисунок размером в пару гигабайт. Это привело бы к жуткому падению производительности Windows. Может, клиентский рисунок был слишком большой? Может, есть какие-то проблемы с самим файлом, которые заставляют декодер формата JPEG в Windows решать, что рисунок "неправильный"?

Клиент согласился предоставить подозрительный рисунок команде разработчиков для более тщательного исследования. Размер файла был всего лишь 48 Кб, поэтому о слишком большом размере речи быть не могло. Дальше рисунок передали команде разработчиков декодера JPEG, чтобы те попробовали объяснить, почему его отвергала Windows.

Может, рисунок был особым образом поврежден или не совсем соответствовал спецификации? А может, в нем используется функциональность JPEG, не поддерживаемая декодером Windows? Или проблема в дефекте декодера JPEG в Windows, который проявился только в этом рисунке?

Но команде разработчиков оболочки так и не пришлось обращаться к специалистам по декодеру. Ответ стал понятным сразу после получения файла рисунка. Внимательный читатель наверняка уже понял, в чем суть, только услышав о JPEG с восьмиразрядной глубиной цвета. Не существует JPEG-рисунков с такой глубиной цвета — у них она всегда 24-разрядная.

Формат клиентского файла вообще был не JPEG — в реальности это оказался GIF-файл, переименованный с расширением .jpg (GIF, или Graphics Interchange Format, — это еще один формат растрового изображения). Именно поэтому декодер Windows JPEG отвергал его. Просто это был вовсе не JPEG.

Теперь решение проблемы клиенты было очевидным. Надо было взять GIF-файл и преобразовать его в формат BMP или настоящий JPEG. Именно эти форматы Windows 7 допускает к использованию в качестве фоновых рисунков. После преобразования файла им нужно было лишь не забыть присвоить правильное расширение.

Поэтому в следующий раз, когда у вас будут проблемы с JPEG-изображением, начните с проверки того, действительно ли перед вами JPEG-файл.

2 комментария:

  1. Анонимный28 июня 2011 г., 9:28

    Мдааа... сигнатуры придумали дураки. Блин, в KDE даже если у файла нет расширения, он всё равно определится правильно.

    ОтветитьУдалить
  2. На всё есть свои причины.

    Несложно сообразить, что распознавание сигнатуры файла работает существенно медленнее распознавания расширения файла.

    Вы бы прокляли всё на свете, если бы система использовала бы сигнатуры файла для ваших файлов на дискетах в системе с Intel 80386. Неожиданно операция, которая занимала полминуты стала бы занимать полчаса.

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.