# Class PIFReader

java.lang.Object
fr.iutfbleau.sae.mpif.PIFReader

public class PIFReader extends Object
Cette classe permet de lire un fichier .pif et de reconstruire l'image d'origine. Elle lit d'abord l'en-tête puis les longueurs des codes canoniques. Ensuite elle reconstruit les codes, construit les arbres de décodage et décode les pixels un par un pour obtenir l'image RGB finale. Elle est utilisée par le programme Viewer pour afficher une image .pif.

## Constructor Summary

Constructors
Constructor
Description
`PIFReader()`

## Method Summary

Modifier and Type
Method
Description
`DecodeNode`
`buildDecodageTree(Map<String,Integer> codes)`
Construit un arbre de décodage à partir des codes canoniques.
`RGBImage`
`decodePifFile(File file)`
Cette methode sert de point d'entrer pour le decodage d'un pif.
`RGBImage`
`decodePixels(BitInputStream in, DecodeNode red, DecodeNode green, DecodeNode blue)`
Décode l'ensemble des pixels de l'image en utilisant les trois arbres correspondant aux composantes rouge, verte et bleue.
`static boolean`
`isPIFFile(File f)`
Vérifie si un fichier est un fichier .pif valide.
`void`
`readCanonicalTables(BitInputStream in)`
Lit les longueurs des code canoniques pour les trois composantes rouge, vert et bleu.
`void`
`readHeader(BitInputStream in)`
Lit l'en-tête du fichier .pif.
`Map<String,Integer>`
`rebuildCanonical(int[] lengths)`
Reconstruit les codes canoniques à partir des longueurs stockées dans le fichier.

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

## Constructor Details

### PIFReader

public PIFReader()

## Method Details

### decodePifFile

public RGBImage decodePifFile(File file) throws Exception
Cette methode sert de point d'entrer pour le decodage d'un pif. Elle Lit complètement un fichier .pif et renvoie l'image décodée. Elle lit l'en-tête, récupère les longueurs des codes, reconstruit les codes canoniques puis les arbres nécessaires au décodage. Enfin elle lit pixel par pixel.

Parameters:
  `file` - fichier .pif à décoder
Returns:
  l'image obtenue après décodage
Throws:
  `Exception` - si le fichier est invalide ou si une erreur survient pendant la lecture

### readHeader

public void readHeader(BitInputStream in) throws IOException
Lit l'en-tête du fichier .pif. On y récupère la largeur et la hauteur de l'image, chacune codée sur 16 bits.

Parameters:
  `in` - flux binaire à lire
Throws:
  `IOException` - si la lecture échoue

### readCanonicalTables

public void readCanonicalTables(BitInputStream in) throws IOException
Lit les longueurs des code canoniques pour les trois composantes rouge, vert et bleu. Chaque table contient 256 valeurs sur 5 bits. Ces longueurs permettront de reconstruire les vrais codes plus tard

Parameters:
  `in` - flux binaire d'entrée pdfpdof
Throws:
  `IOException` - si erreur de lecture se produit

### rebuildCanonical

public Map<String,Integer> rebuildCanonical(int[] lengths)
Reconstruit les codes canoniques à partir des longueurs stockées dans le fichier. On trie d'abord les paires (symbole, longueur), puis on génère les codes en appliquant la règle des codes canoniques.

Parameters:
  `lengths` - tableau contenant les longueurs des codes pour 256 symboles
Returns:
  une table qui associe un code binaire (sous forme de texte) à son symbole

### buildDecodageTree

public DecodeNode buildDecodageTree(Map<String,Integer> codes)
Construit un arbre de décodage à partir des codes canoniques. Chaque code binaire définit un chemin dans l'arbre jusqu'à une feuille contenant le symbole à décoder.

Parameters:
  `codes` - dictionnaire associant le code binaire au symbole
Returns:
  la racine de l'arbre de décodage

### decodePixels

public RGBImage decodePixels(BitInputStream in, DecodeNode red, DecodeNode green, DecodeNode blue) throws IOException
Décode l'ensemble des pixels de l'image en utilisant les trois arbres correspondant aux composantes rouge, verte et bleue. Chaque symbole est lu en parcourant l'arbre bit par bit.

Parameters:
  `in` - flux binaire contenant les données des pixels
  `red` - arbre de décodage pour le rouge
  `green` - arbre pour le vert
  `blue` - arbre pour le bleu
Returns:
  l'image RGB reconstruite
Throws:
  `IOException` - si un symbole est invalide ou si la lecture échoue

### isPIFFile

public static boolean isPIFFile(File f)
Vérifie si un fichier est un fichier .pif valide. On teste l'existence du fichier, son extension et une taille minimale permettant au moins de contenir l'en-tête et les tables de longueurs.

Parameters:
  `f` - fichier à tester
Returns:
  true si le fichier semble être un .pif valide, sinon false