Detectar Eof para imágenes JPG

Estoy enviando muchas imágenes de mi servidor al cliente en secuencia continuamente a través de TCP. Ahora en el cliente, ¿cómo debo detectar eficientemente que este es el final de mi imagen, así que anótelo en el sistema de archivos y luego en la imagen siguiente, etc.

Atentamente, …

Bueno, no hay garantía de que no encontrará FFD9 dentro de una imagen JPEG. La mejor forma de encontrar el final de una imagen jpeg es analizarla. Cada marcador, excepto FFD0 a FFD9 y FF01 (reservado), es seguido inmediatamente por un especificador de longitud que le dará la longitud de ese segmento marcador, incluyendo el especificador de longitud pero no el marcador. FF00 no es un marcador, pero para sus propósitos puede tratarlo como marcador sin un especificador de longitud.

El especificador de longitud tiene dos bytes de longitud y es big endian. Entonces lo que harás es buscar FF, y si el siguiente byte no es uno de 0x00, 0x01 o 0xD0-0xD8, lees el especificador de longitud y salta hacia adelante en la secuencia, siempre que el especificador de longitud indique menos dos bytes.

Además, cada marcador se puede rellenar al principio con cualquier cantidad de FF.

Cuando llegas a FFD9 estás al final de la transmisión.

Por supuesto, podría leer la palabra palabra por palabra, buscando FF si quiere rendimiento, pero eso queda como ejercicio para el lector. 😉

Una mirada rápida al artículo JPEG de Wikipedia le habría dado la respuesta:

  • los bytes 0xFF, 0xD8 indican el inicio de la imagen
  • los bytes 0xFF, 0xD9 indican el final de la imagen

Si envía las imágenes a través de una matriz de bytes, simplemente puede agregar el tamaño del archivo de la imagen como un par de bytes antes del inicio del archivo.
El cliente toma los dos primeros bytes para encontrar el número especificado de bytes (llamaremos a esa x ) y los descarta, luego transfiere el siguiente x número de bytes a un buffer que puede escribir en el archivo.
Enjuague y repita para todos los siguientes jpegs.

Una alternativa es simplemente buscar el marcador FFD9: si no me equivoco, cualquier valor comprimido FF se codificará como FF00 (el byte 00 se descarta y el byte FF se mantiene).
El problema con esto es que obtienes cosas como miniaturas con sus propios encabezados FFD9, pero esos están contenidos dentro de un segmento en los encabezados. Esos segmentos tienen un valor de longitud en los dos bytes después de su marcador, por lo que puede saltar al final de cualquier segmento que encuentre para evitar la detección eoi prematura.

onemase

¿Por qué dice que no hay garantía de encontrar EOI? Debe estar allí al final.

Hay al menos un marcador más que no está seguido por un campo de 2 bytes de longitud. Es SOS, Inicio del escaneo, 0xFFDA. Es seguido por

longitud – Ls especificado como 6 + 2xNs (dos bytes)

número de segmentos Ns (un byte)

los siguientes campos de este encabezado no contienen el tamaño de los datos de entropía que siguen al encabezado SOS. Por lo tanto, la única forma de encontrar el tamaño es buscar byte por byte para EOI (Fin de la imagen) = 0xFFD9.

Me encantaría encontrar otra manera.