web-dev-qa-db-fra.com

Détecter Eof pour les images JPG

J'envoie de nombreuses images de mon serveur au client en séquence en continu via TCP.Maintenant au client, comment dois-je détecter efficacement que c'est la fin de ma seule image, alors écrivez-la dans le système de fichiers, puis l'image suivante et ainsi de suite.

Meilleures salutations, ...

22
Zai

Eh bien, il n'y a aucune garantie que vous ne trouverez pas FFD9 dans une image jpeg. La meilleure façon de trouver la fin d'une image jpeg est de l'analyser. Chaque marqueur, à l'exception de FFD0 à FFD9 et FF01 (réservé), est immédiatement suivi d'un spécificateur de longueur qui vous donnera la longueur de ce segment de marqueur, y compris le spécificateur de longueur mais pas le marqueur. FF00 n'est pas un marqueur, mais pour vos besoins, vous pouvez le traiter comme un marqueur sans spécificateur de longueur.

Le spécificateur de longueur mesure deux octets et est gros boutiste. Donc, ce que vous ferez est de rechercher FF, et si l'octet suivant n'est pas l'un des 0x00, 0x01 ou 0xD0-0xD8, vous lisez le spécificateur de longueur et sautez dans le flux tant que le spécificateur de longueur indique moins deux octets.

De plus, chaque marqueur peut être complété au début avec n'importe quel nombre de FF.

Lorsque vous arrivez à FFD9, vous êtes à la fin du flux.

Bien sûr, vous pouvez lire le flux Word par Word, en recherchant FF si vous voulez des performances, mais cela reste un exercice pour le lecteur. ;-)

33
onemasse

Un rapide coup d'œil à article JPEG de Wikipedia vous aurait donné la réponse:

  • octets 0xFF, 0xD8 indiquent le début de l'image
  • octets 0xFF, 0xD9 indiquent la fin de l'image
16
darioo

Si vous envoyez les images via un tableau d'octets, vous pouvez simplement ajouter la taille de fichier de l'image sous forme de paire d'octets avant le début du fichier.
Le client saisit les deux premiers octets pour trouver le nombre spécifié d'octets (nous l'appellerons x) et les rejette, puis pompe le prochain x nombre d'octets dans un tampon qu'il peut écrire dans un fichier.
Rincez et répétez pour tous les jpegs suivants.

Une alternative consiste simplement à rechercher le marqueur FFD9 - si je ne me trompe pas, toute valeur compressée FF sera codée en FF00 (l'octet 00 est ignoré et l'octet FF est conservé).
Le problème avec ceci est que vous obtenez des choses comme des miniatures avec leurs propres en-têtes FFD9, mais ceux-ci sont contenus dans un segment dans les en-têtes. Ces segments ont une valeur de longueur dans les deux octets après leur marqueur afin que vous puissiez simplement passer à la fin de tout segment que vous rencontrez pour éviter une détection prématurée des eoi.

1
TheHitchenator