Декодируйте файл изображения JFIF в C # - PullRequest
1 голос
/ 25 ноября 2010

У меня есть изображение JPEG в формате JFIF.Я хочу расшифровать его и получить размер.

Вот мой код:

while (binaryReader.ReadByte() == 0xff)
        {
            byte marker = binaryReader.ReadByte();
            ushort chunkLength = binaryReader.ReadLittleEndianInt16();

            if (marker == 0xc0)
            {
                binaryReader.ReadByte();

                int height = binaryReader.ReadLittleEndianInt16();
                int width = binaryReader.ReadLittleEndianInt16();
                return new Size(width, height);
            }

            binaryReader.ReadBytes(chunkLength - 2);
        }

Хорошо.Этот фрагмент кода является распространенным, и вы можете найти его по всему Интернету.Он отлично работает для большинства изображений JPEG.

Теперь это конкретное изображение, полученное камерой - «Canon EOS 300D DIGITAL», не поддерживает этот фрагмент кода.Маркер для измерения 0xFFC2 вместо 0xFFC0.

Мой вопрос, какой из них правильный?Если код правильный, то как камера Canon может создавать нестандартное изображение?Если камера Canon верна, то как мы можем исправить код, чтобы найти размер этого изображения?

Спасибо.

1 Ответ

3 голосов
/ 25 ноября 2010

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

см., Например, http://en.wikipedia.org/wiki/JPEG, который объясняет, что такое "прогрессивный" формат (см. Раздел "Сжатие JPEG").

да, я думаю, вы можете изменить свой оператор if, чтобы проверять как 0xc0 (маркер SOF0), так и 0xc2 (маркер SOF2), потому что они, похоже, имеют похожую структуру (см. Раздел «Синтаксис и структура»).см. также здесь: http://fjcore.googlecode.com/svn/trunk/FJCore/Decoder/JpegDecoder.cs

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

...