Il y a quand même un avantage à séparer les plans et compter les bits : comme après des 0 viennent des 1, et inversement, il n'y a pas besoin d'indiquer la valeur de ce qui est répété, c'est la position du compteur qui indique le bit répété (les octets en position paire codent les 0, ceux en position impaire, les 1).
Exemple : 0|42|53|255|0|50

42 “1”, 53 “0”, 305 “1” (soit 400 pixels dont ce n'est qu'un seul des 2 plans).
Cependant, on ne peut pas se contenter de juxtaposer les 2 listes obtenues (1 par plan) qui, d'ailleurs, n'ont pas forcément la même taille, il faut un header pour indiquer la séparation entre les 2 listes.
Si l'exemple donné représente le premier plan (celui des bits de poids fort des pixels), le second plan pourra être : 23|17|255|0|25|50|0|30.
Si l'entête est le codage sur 2 octets de la taille du premier plan (soit au moins 65'535 pixels codables, le pire des cas étant un plan 1|1|1|1...) en big-endian (ordre du 68k), ça donne : 0|6|0|42|53|255|0|50|23|17|255|0|25|50|0|30

16 octets pour 400 pixels, c'est vraiment pas mal.
Comme je l'ai déjà dit en
./40 (entre autres), le travail en plans séparés et bit à bit donne, je pense, la meilleure compression possible.
MAIS encore faut-il compresser les 400 pixels initiaux en ces 16 octets, et réciproquement décompresser ces 16 octets en 400 pixels.
Et là, je vous souhaite bien du courage (Asm rulez

!!!)