Разбор JPEG SOS Маркер

Eстьвопрос с тем же названием но, к сожалению, это не помогает мне.

Я пытаюсь проанализировать данные маркера SOS. Все документы, которые я могу найти, говорят, что после маркера (0xFFDA) следует двухбайтовое число, которое определяет, как долго этот сегмент -например здесь - как с большинством маркеров переменного размера. Но я, кажется, не правильно понимаю это в этом случае. Это работает для любого другого типа маркера.

Я проверил несколько файлов, но просто не могу понять это правильно. Разве это число не определяет, как долго заполнено поле SOS? Таким образом, для базового JPEG должен быть только один сегмент SOS, а после него должен следовать маркер End Of Image. Если он прогрессивный, может быть несколько SOS-сегментов, но все они должны иметь поле длины.

У меня есть одна фотография сSOF0 Маркер так должен быть базовым. Я считаю, что это правильноSOFn маркер, потому что разрешение изображения можно найти после этого маркера. С помощью шестнадцатеричного редактора я нашел 30xFFDA маркер и все они имеют0x000C в следующих 2 байтах. Так что этот сегмент, насколько я понимаю, всегда должен быть длиной 12 байт. Но во всех 3 случаях после 12 байтов данных нет нового маркера. Я думаю, самое последнее - это сканирование, которое я ищу, потому что если значение0xFF подходит, сопровождается0x00 - кроме маркеров сброса.

Эти два байта следуют0xFFDA не длина полей?

РЕДАКТИРОВАТЬ: Таким образом, благодаря комментариям и ответу, кажется, нет никакого поля длины для фактических сжатых данных, и единственный способ узнать, где они заканчиваются, кажется, декодирует их.

Почему базовое изображение DCT имеет несколько сканирований? Я бы понял, почему у него есть два; основное изображение и миниатюра, но что такое третье сканирование?

Но есть еще одна вещь. Согласно метке DRI (Define Restart Interval) он содержит значение, после которого у Scan должен быть маркер перезапуска0xFFD0 - 0xFFD7, Но я, кажется, неправильно понимаю это, или я делаю это неправильно. Например, маркер содержал значение0x0140 как интервал перезапуска. В следующем сканировании я начал с начала и искал первый0xFFD0 но он пришел после 862 байта вместо 320.

Ответы на вопрос(2)

Ваш ответ на вопрос