From 7ca18b8be82d50079a04600f3ae76463e3e85f23 Mon Sep 17 00:00:00 2001
From: AlgaLaptop
pour le décodage
+ * 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.
+ *
+ * @param lengths tableau contenant les longueurs des codes pour 256 symboles
+ * @return une table qui associe un code binaire (sous forme de texte) à son symbole
*/
public Map rebuildCanonical(int[] lengths) {
// je cree une liste de paires (symbole, longueur)
@@ -110,11 +116,8 @@ public class PIFReader {
}
// Je trie par longueur croissante, puis par symbole croissant
- entiers.sort((a, b) -> {
- int cmp = a.getValue().compareTo(b.getValue());
- if (cmp != 0) return cmp;
- return a.getKey().compareTo(b.getKey());
- });
+ ComparateurEntreeCanonique comparateur = new ComparateurEntreeCanonique();
+ entiers.sort(comparateur);
// je genere les codes canoniques
Map codes = new HashMap<>();
@@ -146,9 +149,11 @@ public class PIFReader {
}
/**
- * Construit l'arbre de décodage à partir des codes canoniques.
+ * 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.
*
- * @param codes Map les codes canoniques avec les bits comme clés et les symboles comme valeurs
+ * @param codes dictionnaire associant le code binaire au symbole
* @return la racine de l'arbre de décodage
*/
public DecodeNode buildDecodageTree(Map codes) {
@@ -193,14 +198,17 @@ public class PIFReader {
/**
- * Décode les pixels à partir des arbres de décodage.
+ * 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.
*
- * @param in flux d'entrée binaire
- * @param red arbre de décodage pour la composante rouge
- * @param green arbre de décodage pour la composante verte
- * @param blue arbre de décodage pour la composante bleue
- * @return l'image reconstruite
- */
+ * @param in flux binaire contenant les données des pixels
+ * @param red arbre de décodage pour le rouge
+ * @param green arbre pour le vert
+ * @param blue arbre pour le bleu
+ * @return l'image RGB reconstruite
+ * @throws IOException si un symbole est invalide ou si la lecture échoue
+ */
public RGBImage decodePixels(BitInputStream in, DecodeNode red, DecodeNode green, DecodeNode blue) throws IOException{
RGBImage image = new RGBImage(width, height);
@@ -220,12 +228,15 @@ public class PIFReader {
}
/**
- * Décode un symbole en parcourant l'arbre bit par bit
- * @param in le flux d'entrée binaire
- * @param root la racine de l'arbre de décodage
- * @return le symbole décodé (valeur entre 0 et 255)
- * @throws IOException si une erreur d'entrée/sortie se produit
+ * Décode un seul symbole en parcourant l'arbre tant qu'on n'est pas sur une feuille.
+ * Chaque bit lu détermine si on part à gauche ou à droite dans l'arbre.
+ *
+ * @param in flux binaire source
+ * @param root racine de l'arbre de décodage
+ * @return la valeur du symbole trouvé
+ * @throws IOException si un chemin est invalide ou si la lecture échoue
*/
+
private int decodeSymbole(BitInputStream in, DecodeNode root) throws IOException {
DecodeNode current = root;
@@ -250,6 +261,14 @@ public class PIFReader {
}
+ /**
+ * 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.
+ *
+ * @param f fichier à tester
+ * @return true si le fichier semble être un .pif valide, sinon false
+ */
public static boolean isPIFFile(File f) {
if (f == null){
return false;