Сколько байтов необходимо для полной миниатюры прогрессивного JPEG?

Я пытаюсь создать загрузчик, который загружает прогрессивные файлы в два этапа:

  1. Загрузите минимальное количество байтов для создания эскиза (0-10%)
  2. Загрузите оставшиеся байты для миниатюры. (11%-100%)

Я хочу сделать это, чтобы миниатюры были доступны ранее без необходимости загрузки отдельного эскиза. Получение изображения (3426398 байт), созданного с jpegtran -copy all -progressive -outfile progressive.jpg original.jpg а затем взять первые 350000 байт с dd if=progressive.jpg of=thumb.jpg bs=1 count=350000 Я получил эскиз, который работает.

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

1 ответ

Решение

Прогрессивное изображение JPEG состоит из серии "Сканов". Каждое сканирование предоставляет постепенно больше информации для каждого блока MCU (больше коэффициентов A/C). Первое сканирование обычно представляет собой значения DC для каждого MCU. Это идеальное количество информации, чтобы получить уменьшенное изображение 1/8 размера.

В файле JPEG каждое сканирование начинается с маркера FOS FOS (начало сканирования). Чтобы узнать, сколько данных необходимо для полного хранения первого сканирования, просто выполните поиск в данных файла для начала второго сканирования (второй маркер FFDA), и у вас есть свой ответ. Из-за правил байтов маркера, 2-байтовая последовательность FF DA не может быть чем-либо, кроме маркера SOS. Сжатые данные, которым необходимо кодировать значение FF, за которым следует DA, должны быть закодированы как FF 00 DA.

Другие вопросы по тегам