Huffman

Algorithme utilisé par Up ! System

L'algorithme Huffman de l'International Telecommunication Union (ITU) a pour principe de coder sur moins de bits les valeurs les plus représentées dans un flux et plus de bits ceux les moins représentés.

Une valeur peut être un paquet de bits qui n'est pas forcément un octet.

Ainsi :

Une statistique doit être établie sur la fréquence d'apparition d'un octet dans un flux :

Cet algorithme n'est pas une norme : rien ne définit quelles sont les plages d'encodage - nombre de bits minimal - et quelle statistique employer.

Ce paramétrage varie en fonction de l'application utilisant l'algorithme. Par exemple, la compression pour les images au format Tagged Information File Format (TIFF) utilise la statistique du Comité Consultatif International pour le Téléphone et le Télégraphe (CCITT) établie pour les télécopies.

C'est la convention retenue par défaut par Up ! System dès lors que l'algorithme Huffman n'est pas encapsulé dans une norme en possédant une particulière.

Statistique retenue par le CCITT

Les valeurs à encoder sont les longueurs de successions uniformes de bits 0 - pixels blancs - et de bits 1 - pixels noirs qui alternent.

La compression est réinitialisée à chaque ligne et, par convention, chaque ligne commence par un pixel blanc. Sinon, il faut encoder une longueur de 0 pixel blanc.

Une longueur peut être soit terminale - il existe un code - soit non terminale - elle est divisée en sous longueurs de tailles maximales et donc en plusieurs codes. Par exemple :

Les codes des longueurs sont ensuite assemblés en octets.

Pixels blanc

Voici les codes des longueurs pour les bits 0 - pixels blancs :

Code en binaire.Est terminal.Longueur.
00110101Oui0
000111Oui1
0111Oui2
1000Oui3
1011Oui4
1100Oui5
1110Oui6
1111Oui7
10011Oui8
10100Oui9
00111Oui10
01000Oui11
001000Oui12
000011Oui13
110100Oui14
110101Oui15
101010Oui16
101011Oui17
0100111Oui18
0001100Oui19
0001000Oui20
0010111Oui21
0000011Oui22
0000100Oui23
0101000Oui24
0101011Oui25
0010011Oui26
0100100Oui27
0011000Oui28
00000010Oui29
00000011Oui30
00011010Oui31
00011011Oui32
00010010Oui33
00010011Oui34
00010100Oui35
00010101Oui36
00010110Oui37
00010111Oui38
00101000Oui39
00101001Oui40
00101010Oui41
00101011Oui42
00101100Oui43
00101101Oui44
00000100Oui45
00000101Oui46
00001010Oui47
00001011Oui48
01010010Oui49
01010011Oui50
01010100Oui51
01010101Oui52
00100100Oui53
00100101Oui54
01011000Oui55
01011001Oui56
01011010Oui57
01011011Oui58
01001010Oui59
01001011Oui60
00110010Oui61
00110011Oui62
00110100Oui63
11011Non64
10010Non128
010111Non192
0110111Non256
00110110Non320
00110111Non384
01100100Non448
01100101Non512
01101000Non576
01100111Non640
011001100Non704
011001101Non768
011010010Non832
011010011Non896
011010100Non960
011010101Non1024
011010110Non1088
011010111Non1152
011011000Non1216
011011001Non1280
011011010Non1344
011011011Non1408
010011000Non1472
010011001Non1536
010011010Non1600
011000Non1664
010011011Non1728
00000001000Non1792
00000001100Non1856
00000001101Non1920
000000010010Non1984
000000010011Non2048
000000010100Non2112
000000010101Non2176
000000010110Non2240
000000010111Non2304
000000011100Non2368
000000011101Non2432
000000011110Non2496
000000011111Non2560
000000000001OuiFin de ligne

Pixels noirs

Voici les codes des longueurs pour les bits 0 - pixels noirs :

Code en binaire.Est terminal.Longueur.
0000110111Oui0
010Oui1
11Oui2
10Oui3
011Oui4
0011Oui5
0010Oui6
00011Oui7
000101Oui8
000100Oui9
0000100Oui10
0000101Oui11
0000111Oui12
00000100Oui13
00000111Oui14
000011000Oui15
0000010111Oui16
0000011000Oui17
0000001000Oui18
00001100111Oui19
00001101000Oui20
00001101100Oui21
00000110111Oui22
00000101000Oui23
00000010111Oui24
00000011000Oui25
000011001010Oui26
000011001011Oui27
000011001100Oui28
000011001101Oui29
000001101000Oui30
000001101001Oui31
000001101010Oui32
000001101011Oui33
000011010010Oui34
000011010011Oui35
000011010100Oui36
000011010101Oui37
000011010110Oui38
000011010111Oui39
000001101100Oui40
000001101101Oui41
000011011010Oui42
000011011011Oui43
000001010100Oui44
000001010101Oui45
000001010110Oui46
000001010111Oui47
000001100100Oui48
000001100101Oui49
000001010010Oui50
000001010011Oui51
000000100100Oui52
000000110111Oui53
000000111000Oui54
000000100111Oui55
000000101000Oui56
000001011000Oui57
000001011001Oui58
000000101011Oui59
000000101100Oui60
000001011010Oui61
000001100110Oui62
000001100111Oui63
0000001111Non64
000011001000Non128
000011001001Non192
000001011011Non256
000000110011Non320
000000110100Non384
000000110101Non448
0000001101100Non512
0000001101101Non576
0000001001010Non640
0000001001011Non704
0000001001100Non768
0000001001101Non832
0000001110010Non896
0000001110011Non960
0000001110100Non1024
0000001110101Non1088
0000001110110Non1152
0000001110111Non1216
0000001010010Non1280
0000001010011Non1344
0000001010100Non1408
0000001010101Non1472
0000001011010Non1536
0000001011011Non1600
0000001100100Non1664
0000001100101Non1728
00000001000Non1792
00000001100Non1856
00000001101Non1920
000000010010Non1984
000000010011Non2048
000000010100Non2112
000000010101Non2176
000000010110Non2240
000000010111Non2304
000000011100Non2368
000000011101Non2432
000000011110Non2496
000000011111Non2560
00000000000OUiFin de ligne