Сколько байтов необходимо для полной миниатюры прогрессивного JPEG?
Я пытаюсь создать загрузчик, который загружает прогрессивные файлы в два этапа:
- Загрузите минимальное количество байтов для создания эскиза (0-10%)
- Загрузите оставшиеся байты для миниатюры. (11%-100%)
Я хочу сделать это, чтобы миниатюры были доступны ранее без необходимости загрузки отдельного эскиза. Получение изображения (3426398 байт), созданного с jpegtran -copy all -progressive -outfile progressive.jpg original.jpg
а затем взять первые 350000 байт с dd if=progressive.jpg of=thumb.jpg bs=1 count=350000
Я получил эскиз, который работает.
- Оригинал: https://dl.dropbox.com/u/5910/thumbtest/progressive.jpg
- Миниатюра: https://dl.dropbox.com/u/5910/thumbtest/thumb.jpg
Есть ли способ узнать, сколько байтов я должен передать, чтобы получить изображение, где все строки доступны? Таким образом, только теряя качество изображения?
1 ответ
Прогрессивное изображение JPEG состоит из серии "Сканов". Каждое сканирование предоставляет постепенно больше информации для каждого блока MCU (больше коэффициентов A/C). Первое сканирование обычно представляет собой значения DC для каждого MCU. Это идеальное количество информации, чтобы получить уменьшенное изображение 1/8 размера.
В файле JPEG каждое сканирование начинается с маркера FOS FOS (начало сканирования). Чтобы узнать, сколько данных необходимо для полного хранения первого сканирования, просто выполните поиск в данных файла для начала второго сканирования (второй маркер FFDA), и у вас есть свой ответ. Из-за правил байтов маркера, 2-байтовая последовательность FF DA не может быть чем-либо, кроме маркера SOS. Сжатые данные, которым необходимо кодировать значение FF, за которым следует DA, должны быть закодированы как FF 00 DA.