pcx2jif : utilitaire pour convertir des images PCX en image JIF (Jester Image Format)

Cette commande convertit une image dans le format PCX en une image dans le format JIF. Une image JIF utilise une compression RLE adaptée au processeur vidéo des machines Exelvision, à la faible puissance du CPU et au peu de mémoire disponible dans un Exl100. Le format JIF est détaillé ci-après. Le format PCX en entrée doit être en mode 8bits par pixel et n'utiliser qu'un seul plan de couleur, sans palette.
L'image PCX doit être encodée en 8 couleurs (numérotées de 0 à 7) pour une résolution maximale de 320x250 pour une image couleur, et en 2 couleurs (numérotées 0 et 1) pour une résolution maximale de 640x250 pour une image N&B monochrome (possible uniquement sur Exeltel dans le mode 80 colonnes).
La largeur d'une image doit être un multiple de 8 pixels pour une image couleur et un multiple de 16 pixels pour une image en mode 80colonnes. Cette contrainte sur la largeur des images est une conséquence directe de la gestion particulière de la mémoire écran par le VDP. La manière de générer ce genre d'image PCX est détaillée ci-après.


pcx2jif sourceFile targetFile [-b]
sourceFile = fichier PCX en entrée
targetFile = fichier JIF en sortie
-b = précise que l'image en entrée est destinée au mode haute résolution monochrome (mode 80 colonnes de l'Exeltel)

exemple:
pcx2jif 1942.pcx 1942.jif (mode couleur classique)
pcx2jif zebre.pcx zebre.jif (mode 80 colonnes N&B)


Comment obtenir simplement une image dans un format PCX correct ?
La première chose est d'avoir une image dont la largeur est un multiple de 8 ou 16 selon le mode destination (couleur ou N&B haute résolution).
On peut ensuite utiliser une boîte à outil comme ImageMagick pour manipuler l'image source dans tous les sens?
- pour générer une image avec 8 couleurs (8bits par pixel) directement:
convert 1942.gif -dither none -posterize 2 1942_8.pcx
L'absence de "dithering" est préférable pour une image couleur en basse résolution. Le résultat de cette conversion automatique est parfois peu satisfaisante si l'image source contient plus de 32 couleurs.

- pour générer une image avec 8 couleurs (8bits par pixel) avec filtrage manuel des seuils sur les différentes composantes:
convert 1942.gif -channel red -threshold 112 -channel green -threshold 112 -channel blue -threshold 112 1942_8.pcx
Il suffit de jouer sur les valeurs pour filtrer chaque composante. Le résultat est meilleur mais le travail laborieux: un outil WYSIWYG serait le bienvenu !

- pour générer une image avec 2 couleurs (black & white 8bits par pixel) le travail se fait en plusieurs étapes:
D'abord on convertit l'image source en monochrome. On peut utiliser un motif (ordered-dither) pour améliorer le résultat (et simuler des niveaux de gris)
convert 1942.gif -scale 100%x50% -ordered-dither o2x2 -colors 2 -monochrome 1942.pcx
L'image est en PCX 1bit par pixel, on ramène alors le format à 8 bits par pixel comme suit:
convert 1942.pcx -dither none -posterize 2 1942.pcx


Spécification du format JIF (Jester File Format):
L'image est composée d'un en-tête de 10 octets, puis des données de l'image.
Header: 10 octets
- octets 1 à 3 : les caractères J I F
- octet 4 : numéro de version (1 pour l'instant)
- octet 5 : largeur de l'image /8 ou /16 (1 à 40, il faut multiplier par 8 pour une image couleur et par 16 pour une image N&B haute résolution)
- octet 6 : hauteur d'une image en nombre de lignes (1 à 250)
- octets 7 à 8 : taille des données image en octets (octet 7 = MSB)
- octet 9 : flag d'image (bit 0 = 1 pour une image couleur, 0 pour image N&B haute résolution)
- octet 10 : réservé

Données d'image:
L'image est compressée et utilise une méthode RLE spécifique.
1) mode couleur
Un octet contient toute les informations de répétition d'une couleur (en cas de compression) ou le nombre de blocs de 8 pixels non compressés.
Octet lu = b7 b6 b5 b4 b3 b2 b1 b0
si b7=1 alors il s'agit d'une succession de blocs de 8 pixels non compressés
	- les bits b6 à b0 indiquent le nombre de blocs -1 à lire.
	- un bloc de 8 pixels non compressé est stocké de la même manière qu'en mémoire VDP: octet composante bleu, octet composante verte, octet composante rouge. Un bloc est donc constitué de 3 octets.
	- il faut donc lire 3* le nombre de blocs précisé dans le premier octet.
sinon si b7=0 alors il s'agit d'une répétition de couleur (compression)
	- les bits b2b1b0 indiquent la valeur de la couleur répétée (format VDP 3556)
	- les bits b6 à b3 indiquent le nombre de répétition -1 de blocs de cette couleur. On répète donc des paquets de 8 pixels de la même couleur.
1) mode N&B haute résolution (80 colonnes)
Un octet contient toute les informations de répétition d'une couleur (en cas de compression) ou le nombre de blocs de 16 pixels non compressés.
Octet lu = b7 b6 b5 b4 b3 b2 b1 b0
si b7=1 alors il s'agit d'une succession de blocs de 16 pixels non compressés
	- les bits b6 à b0 indiquent le nombre de blocs -1 à lire.
	- un bloc de 16 pixels non compressé est stocké de la même manière qu'en mémoire VDP: octet composante bleu, octet composante verte. Un bloc est donc constitué de 2 octets (la composante rouge est ignorée et pas stockée).
	- il faut donc lire 2* le nombre de blocs précisé dans le premier octet.
sinon si b7=0 alors il s'agit d'une répétition de couleur (compression)
	- le bit b0 indique la valeur de la couleur répétée
	- les bits b6 à b1 indiquent le nombre de répétition -1 de blocs de cette couleur. On répète donc des paquets de 16 pixels de la même couleur.

Les démos 1 et 2 qui sont des visualiseurs sur K7 illustrent l'utilisation de ce format (lecture et décompression). Les algorithmes de décompression pour ces deux programmes sont tout à fait réutilisables: ils permettent la décompression d'une image ligne par ligne pour des données compressées en mémoire VDP.

