Подтвердить что ты не робот

Обнаружение Eof для изображений в формате JPG

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

С уважением, ...

4b9b3361

Ответ 1

Ну, нет гарантии, что вы не найдете FFD9 в jpeg-изображении. Лучший способ найти конец jpeg-изображения - это проанализировать его. За каждым маркером, за исключением FFD0 до FFD9 и FF01 (зарезервировано), сразу следует спецификатор длины, который даст вам длину этого сегмента маркера, включая спецификатор длины, но не маркер. FF00 не является маркером, но для ваших целей вы можете рассматривать его как маркер без спецификатора длины.

Спецификатор длины имеет длину два байта и большой endian. Итак, что вы будете делать, это поиск FF, и если следующий байт не является одним из 0x00, 0x01 или 0xD0-0xD8, вы читаете спецификатор длины и пропускаете вперед в потоке, если спецификатор длины говорит минус два байта.

Кроме того, каждый маркер может быть дополнен в начале любым количеством FF.

Когда вы дойдете до FFD9, вы в конце потока.

Конечно, вы могли бы читать поток слово за словом, ища FF, если вы хотите производительность, но это оставило в качестве упражнения для читателя.; -)

Ответ 2

Быстрый просмотр статьи в Википедии JPEG дал бы вам ответ:

  • bytes 0xFF, 0xD8 указывают начало изображения
  • bytes 0xFF, 0xD9 указывают конец изображения

Ответ 3

Если вы отправляете изображения через массив байтов, вы можете просто добавить размер файла изображения в виде пары байтов перед началом файла.
Клиент захватывает первые два байта, чтобы найти указанное количество байтов (мы будем называть это x) и отбрасывает их, а затем накачивает следующее x количество байтов в буфер, который он может записать в файл.
Промойте и повторите для всех следующих jpeg.

Альтернатива просто ищет маркер FFD9 - если я не ошибаюсь, любое сжатое значение FF будет закодировано как FF00 (байт 00 будет отброшен, а байт FF сохранен).
Проблема заключается в том, что вы получаете такие вещи, как миниатюры с собственными заголовками FFD9, но они содержатся внутри сегмента в заголовках. Эти сегменты имеют значение длины в двух байтах после их маркера, поэтому вы можете просто пропустить до конца любого сегмента, с которым вы сталкиваетесь, чтобы избежать преждевременного обнаружения eoi.

Ответ 4

onemase

Почему вы говорите, что нет гарантии найти EOI? Он должен быть там в конце.

Существует по крайней мере еще один маркер, за которым не следует поле длиной 2 байта. Это SOS, начало сканирования, 0xFFDA. За ним следует

длина - Ls, заданная как 6 + 2xNs (два байта)

количество сегментов Ns (один байт)

следующие поля этого заголовка не содержат размер энтропийных данных, которые следует за заголовком SOS. Поэтому единственный способ найти размер - это байтовый байт для EOI (End Of Image) = 0xFFD9.

Я хотел бы найти другой путь.