декодирование формата файла jpeg - PullRequest
9 голосов
/ 21 июля 2011

Я пытаюсь написать кодировщик и декодер JPEG / JFIF с нуля, используя C. Я экспериментировал с написанием примера файла JPEG, но, похоже, я не могу открыть его с помощью MS Paint, Firefox.Но я могу декодировать его, используя JPEGsnoop (http://www.impulseadventure.com/photo/jpeg-snoop.html?ver=1.5.2) и http://nothings.org/stb_image.c. Я думаю, что образец файла JPEG соответствует стандарту JPEG / JFIF, я не знаю, почему приложения, такие как MS paint и Firefox, не могут его открыть.

Вот как выглядит пример JPEG:


    SOI
       APP0 segment
       DQT  segment (contains two quantization tables)
       COM  segment
       SOF0 segment
       DHT  segment (contains four Huffman tables)
       SOS  segment
       huffman encoded data
    EOI

Файл примера JPEG содержит три компонента Y Cb Cr. Нет подвыборки для компонента Cb Cr. Все две таблицы квантования заполнены.Четыре таблицы Хаффмана в сегменте DHT все идентичны, это выглядит так:


      [0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0]
      [0,1,2, ... , 254]

Это означает, что все коды являются 8-битными, поэтому кодирование Хаффмана на самом деле не сжимает данные.

Закодированные Хаффманом данные выглядят так:


       [0x0000(DC) 0x0000(AC)](Y)  
       [0x0000(DC) 0x0000(AC)](Cb) 
       [0x0000(DC) 0x0000(AC)](Cr)  for all (i, j) MCUs except (10, 10)

       the data in (10, 10) MCU: 
       [0x0008(DC) 0x0000(DC), 0x0000(AC)](Y)  
       [0x0000(DC) 0x0000(AC)](Cb) 
       [0x0000(DC) 0x0000(AC)](Cr)

Может кто-нибудь сказать мне, что не так с этим образцом файла JPEG? Спасибо.

Вот ссылка на образец файла JPEG (ха.JPG) http://www.guoxiaoyong.net/ha.jpg

Ответы [ 3 ]

4 голосов
/ 22 июля 2011

Несколько лет назад у меня была похожая проблема с некоторым кодом PNG (хотя я не писал его с нуля). Оказывается, мой код был в большей степени совместим со стандартами, чем библиотеки Windows, некоторые браузеры и т. Д. Они хорошо работали в типичных случаях, но подавились необычными и надуманными изображениями, даже если они полностью соответствовали стандарту. Распространенным способом их использования было использование нечетной ширины пикселя для изображения. Почти половина моего набора тестов не была доступна для просмотра в Windows. (Это было много версий назад, например, Windows 95. Кодеки Windows значительно улучшились.)

Я закончил создание библиотеки PNG с открытым исходным кодом и использовал ее в качестве эталонной реализации. Пока изображения, которые создавал мой код, могли быть проанализированы эталонной реализацией, и наоборот, я назвал это хорошим. Я также проверил, что мой код может отображать любое изображение, которое может отображать Windows Каждый раз, когда я обнаруживал ошибку, я добавлял изображение в свой набор тестов, прежде чем исправить его. Этого было достаточно для моего проекта.

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

Если вы действительно хотите выяснить, почему Firefox (или что-то еще) не может открыть ваше изображение, вы можете попробовать начать с изображения, которое действительно открывается в Firefox. Постепенно вносите небольшие изменения (например, с помощью шестнадцатеричного редактора), чтобы сделать его более похожим на изображение, которое не удается Это может помочь вам определить, какой аспект вашего изображения запускает приложение. По общему признанию, некоторые из этих шагов могут быть трудны для попытки.

0 голосов
/ 25 июля 2011

Firefox (и многие другие приложения AFAIK) основаны на библиотеке JPEG с открытым исходным кодом из Независимой группы JPEG .

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

Кроме того, это спасет вас от повторного изобретения колеса: -)

0 голосов
/ 25 июля 2011

Я думаю, что ваш файл очень нетрадиционно закодирован. Я бы посоветовал вам найти справочный файл и попытаться имитировать эту структуру. Также я бы использовал образцы таблиц из стандарта. Ваши данные Хаффмана заполнены нулями, в которых каждое значение постоянного тока равно нулю, а затем и Конец блока.

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

...