title: PCX
text: # PCX
  
  Le PCX est un format d'image numérique dont l'encodage est basé sur une forme de run-length encoding.
  
  PCX a été développé par la société ZSoft Corporation à Marietta, dans l'État de Géorgie, aux États-Unis en 1985. C'était le format de base de leur logiciel PC Paintbrush, un des logiciels d'édition d'images les plus populaires sous DOS à l'époque.
  
  La plupart des fichiers PCX utilisent une palette de couleurs, mais le format a été étendu pour permettre l'utilisation d'images 24 bits (3 octets) et dans ce cas l'encodage est réalisé en séparant les trois composantes de couleur. Le format PCX était très populaire sur les premiers systèmes DOS et Windows, mais il se fait de plus en plus rare, car il existe de nos jours des formats permettant une compression bien meilleure, comme GIF, JPEG et PNG.
  
  Le run-length encoding utilisé dans le format PCX permet de réduire la taille des séquences de couleurs identiques en encodant le nombre de répétitions de l'octet de couleur qui suit avec un octet dans l'intervalle 0xC1 … 0xFF. Cela implique de coder les couleurs au delà de 192 (0xC1 … 0xFF) sur deux octets au lieu d'un pour éviter l'ambiguïté avec le début d'une séquence de répétition. Le tri des couleurs de la palette par fréquence décroissante d'utilisation est donc important afin d'éviter l'excès d'octets trop souvent.
  
  Cet algorithme de compression est très rapide et peu exigeant en mémoire, mais n'est pas très efficace, surtout pour les images issues du monde réel.
  
  ## Exemple
  
  Exemple d'une image ayant 241 couleurs différentes, où le cyan est majoritaire (index 0, 0x00) et le jaune minoritaire (index 240, 0xF0)
  
  * Suite de couleur : cyan cyan cyan jaune cyan jaune cyan cyan cyan cyan
  * Association d'un index dans la palette de couleur : 0x00 0x00 0x00 0xF0 0x00 0xF0 0x00 0x00 0x00 0x00
  * Encodage : 3× 0x00 1× 0xF0 0x00 1× 0xF0 4× 0x00
  * Codage final : 0xC3 0x00 0xC1 0xF0 0x00 0xC1 0xF0 0xC4 0x00
  
  Si l'index 0xF0 n'était pas précédé d'un compteur à 1 (0xC1), il serait interprété comme un compteur de répétition 48×.
  
  