Получить ширину и высоту из JPEG без 0xFF 0xC0

Я пытаюсь получить размеры файла (ширину и высоту) из JPEG (в данном случае это изображение из Instagram)

https://scontent.cdninstagram.com/t51.2885-15/s640x640/sh0.08/e35/11264864_1701024620182742_1335691074_n.jpg

Как я понимаю, ширина и высота определяются после маркера 0xFF 0xC0, однако я не могу найти этот маркер на этом рисунке. Он был удален или есть альтернативный маркер, который я должен проверить?

2 ответа

Решение

Маркер JPEG Start-Of-Frame (SOF) имеет 4 возможных значения:

  • FFC0 (базовая линия) - это обычный режим, выбранный для фотографий, который кодирует полностью определенные блоки DCT в группировках в зависимости от выбранных параметров цвета / подвыборки.
  • FFC1 (расширенный) - это похоже на базовый уровень, но имеет более 8 бит на цветовой стимул
  • FFC2 (прогрессивный) - этот режим часто встречается на веб-страницах, чтобы обеспечить постепенную загрузку изображения при получении данных. Каждое "сканирование" изображения постепенно определяет больше коэффициентов блоков DCT, пока они не будут полностью определены. Это эффективно обеспечивает больше и больше деталей по мере декодирования большего количества сканов
  • FFC3 (без потерь) - этот режим использует простое кодирование Хаффмана для кодирования изображения без потерь. Единственное место, где я видел это, используется на 16-битных полутоновых медицинских изображениях DICOM

Если вы сканируете байты в поисках шаблона FFCx, имейте в виду, что вы можете встретить его во встроенном миниатюрном изображении (внутри маркера FFE1 Exif). Чтобы правильно найти SOFx основного изображения, вам нужно пройтись по цепочке маркеров JPEG. 2-байтовая длина (big-endian) следует за 2-байтовым маркером. Последний недостаток, которого следует избегать, заключается в том, что некоторые кодировщики JPEG вставляют дополнительные значения FF между допустимыми маркерами. Если вы встретите FFFF там, где должен быть маркер, просто увеличьте указатель на 1 байт и повторите попытку, пока не найдете действительный маркер.

Вы можете получить его довольно просто в командной строке с помощью ImageMagick, который установлен в большинстве дистрибутивов Linux и доступен для OSX и Windows.

identify -ping https://scontent.cdninstagram.com/t51.2885-15/s640x640/sh0.08/e35/11264864_1701024620182742_1335691074_n.jpg

Выход

https://scontent.cdninstagram.com/t51....1074_n.jpg JPEG 640x640 640x640+0+0 8-bit sRGB 162KB 0.000u 0:00.000
Другие вопросы по тегам