Question

J'essaie d'analyser le format GIF et j'ai un problème avec la lecture des données d'image. Ces données sont représentées comme un tableau de bits, contenant des valeurs de longueur variable.

ex:

0010-1010-0010-0000-00111-10000-11111 ...

Parfois, la longueur du code augmente, mais je ne comprends pas comment je peux détecter cette augmentation. J'ai juste la taille initiale du code (longueur du premier code ex. 4).

Standart dit seulement:

Annexe F. Compression LZW à code de longueur variable.

...

L'aspect code de longueur variable de l'algorithme est basé sur une taille de code initiale (Taille du code initial LZW), qui spécifie le nombre initial de bits utilisé pour les codes de compression.Lorsque le nombre de motifs détectés par le compresseur dans le flux d'entrée dépasse le nombre de motifs encodables avec le courant nombre de bits, le nombre de bits par code LZW est augmenté de un.

...

Était-ce utile?

La solution

Lors de l'analyse d'un fichier GIF, le descripteur d'image inclut la largeur en bits des symboles non codés (exemple: 8 bits). Comme vous le savez probablement déjà, la taille initiale du code des données compressées est un peu plus large que la largeur en bits des symboles non codés (exemple: 9 bits).

De plus, comme vous le savez probablement déjà, les valeurs de code compressé possibles dans un fichier GIF augmentent progressivement en taille, jusqu'à un maximum de 0xFFF== 4095, ce qui nécessite 12 bits pour stocker.

Pour chaque code que le décompresseur extrait des données compressées, le décompresseur ajoute un nouvel élément à son dictionnaire. Par exemple, si les deux premiers codes 9 bits lus par le décompresseur sont 0x028 0x0FF, le décompresseur ajoute une séquence de deux octets à son dictionnaire. Plus tard, si le décompresseur lit un jour le code 0x102, le décompresseur décode ce code 0x102 en deux octets de 8 bits 0x28 0xFF.

L'élément suivant que le décompresseur ajoute au dictionnaire reçoit le code 0x103.

L'élément suivant que le décompresseur ajoute au dictionnaire reçoit le code 0x104. ...

Finalement, le décompresseur ajoute un élément au dictionnaire auquel le code 0x1FF est attribué. C'est le plus grand nombre qui rentre dans 9 bits. Après avoir stocké cet élément dans le dictionnaire, le décompresseur commence à lire les codes 10 bits.

L'élément suivant que le décompresseur ajoute au dictionnaire reçoit le code 0x200.

Il n'y a pas de "commande" spéciale dans la séquence de données qui indique au décompresseur d'incrémenter la largeur du code. Le décompresseur doit garder une trace du nombre d'éléments que le dictionnaire contient jusqu'à présent (qui peuvent souvent être facilement réutilisés comme index de l'endroit où écrire l'élément suivant dans le dictionnaire). Lorsque le décompresseur ajoute l'élément 0x1ff au dictionnaire, il est temps pour le décompresseur de commencer à lire les codes 10 bits. Lorsque le décompresseur ajoute l'élément 0x3ff au dictionnaire, il est temps pour le décompresseur de commencer à lire les codes 11 bits.

Autres conseils

Regardez d'abord cet exemple , cela peut être plus clairpour comprendre LZW que de regarder la norme. Et ceci peut également être utile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top