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 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