This commit is contained in:
2025-12-20 14:57:54 +01:00
6 changed files with 102 additions and 36 deletions
+2 -2
View File
@@ -23,10 +23,10 @@ Objectif : Mise en place des fondations techniques
| US-D3 | AD | DONE | 🟩 | Générer les tables de fréquences RGB | | US-D3 | AD | DONE | 🟩 | Générer les tables de fréquences RGB |
| US-D4 | AD | DONE | 🟩 | Construire larbre Huffman | | US-D4 | AD | DONE | 🟩 | Construire larbre Huffman |
| US-D5 | AA | DONE | 🟩 | Générer les codes Huffman | | US-D5 | AA | DONE | 🟩 | Générer les codes Huffman |
| US-D6 | AA | DOING | 🟨 | Générer les codes canoniques | | US-D6 | AA | DONE | 🟩 | Générer les codes canoniques |
| US-U5 | YB | DOING | 🟨 | Chargement dimage via ImageIO | | US-U5 | YB | DOING | 🟨 | Chargement dimage via ImageIO |
| US-D8 | YB | TODO | 🟥 | Structure RGBImage + Pixel | | US-D8 | YB | TODO | 🟥 | Structure RGBImage + Pixel |
| US-P1 | AA | TODO | 🟥 | Interface simple daffichage des fréquences | | US-P1 | AA | DOING | 🟨 | Interface simple daffichage des fréquences |
| US-P2 | AD | DONE | 🟩 | Interface simple daffichage codes Huffman | | US-P2 | AD | DONE | 🟩 | Interface simple daffichage codes Huffman |
| US-P3 | AA | TODO | 🟩 | Interface simple daffichage codes canoniques | | US-P3 | AA | TODO | 🟩 | Interface simple daffichage codes canoniques |
@@ -1,6 +1,23 @@
package fr.iutfbleau.sae; package fr.iutfbleau.sae;
import java.awt.*;
import java.io.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
public class ConverterController { public class ConverterController {
public BufferedImage loadImage(File f){
//verification si le fichier contient quelque chose, si il est exesistant et si c'est un fichier "normal" d'apres la javadoc.
if (f == null || !f.exists() || !f.isFile()) {
return null;
}
BufferedImage image;
try {
image = ImageIO.read(f);
} catch (IOExeption e){
return null;
}
return image;
} }
@@ -1,22 +1,39 @@
package fr.iutfbleau.sae.mhuffman; package fr.iutfbleau.sae.mhuffman;
import java.util.*; import java.util.*;
public class CanonicalCode{ public class CanonicalCode{
private Map<Integer,Integer> codeLenghts = HuffmanNode.getDictionnary(); private Map<Integer,Integer> codeLengths = HuffmanTree.getDictionnary();
private Map<Integer,Integer> canonicalCodes = new HashMap<>(); private Map<Integer,Integer> canonicalCodes = new HashMap<>();
public void generateCodes(){ public Map<Integer,Integer> generateCodes(){
// 1- Premiere chose à faire : trier les codes initiaux par longueur du code : // 1 ere chose à faire : on regarde uniquement la longueur des codes initiaux(Huffman)
// 2eme chose à faire : remettre dans l'ordre des longueurs : si meme taille ==> regarder valeur
// 3eme chose à faire : ecriture des codes canoniques :
List<Integer> codes = new ArrayList<>(); // on recupere les entrées des codes Huffman pour pouvoir les triés
codes = codeLenghts.keySet(); List<Map.Entry<Integer, Integer>> liste = new ArrayList<>(codeLengths.entrySet());
int[] tab = code.toArray(new Integer[0]);
Arrays.sort(tab);
// ici on comparer par longueur de la valeur ou sinon par la clé
// type générique pour éviter les erreurs de compilation !!!
// referencement de méthode : passer une méthode déja existante
liste.sort(Comparator.<Map.Entry<Integer,Integer>>comparingInt(Map.Entry::getValue)
.thenComparing(Map.Entry::getKey));
int code = 0; // code canonique à attribuer
int temp = 0; //garde la longueur du code précedent , pour gérer le décalage
for (Map.Entry<Integer, Integer> entree : liste ) {
int valeur = entree.getKey(); // symbole actuel
int longueur = entree.getValue(); // longueur du code actuel
code <<= (longueur - temp); // permet de décaler le code actuel si la longueur augmente
canonicalCodes.put(valeur,code); // ajout dans le dictionnaire
code++; // incrémentation pour la valeur qui suit
temp = longueur; // mise à jour de la longueur précedente
}
return canonicalCodes;
} }
@@ -57,7 +57,7 @@ public class HuffmanTree {
/** /**
* Dictionnaire pour enregistrer les codes Huffman * Dictionnaire pour enregistrer les codes Huffman
*/ */
private Map<Integer,String> codes; private static Map<Integer,Integer> codes;
/** /**
* Chaine de caracteres qui va nous permettre de sauvegader le code Huffman * Chaine de caracteres qui va nous permettre de sauvegader le code Huffman
@@ -151,7 +151,7 @@ public class HuffmanTree {
* @return Map on stockera les codes Huffman sous forme de dictionnaire * @return Map on stockera les codes Huffman sous forme de dictionnaire
*/ */
public Map<Integer,String> generateCodes(){ public Map<Integer,Integer> generateCodes(){
/** /**
* Le but de cette méthode est de pouvoir generer les codes Huffman à partir de l'arbre : * Le but de cette méthode est de pouvoir generer les codes Huffman à partir de l'arbre :
* Les branches prendront comme valeur 1 ou 0 selon differents cas : * Les branches prendront comme valeur 1 ou 0 selon differents cas :
@@ -164,7 +164,7 @@ public class HuffmanTree {
this.chaineCarac = new String(); this.chaineCarac = new String();
if(root.isLeaf()){ if(root.isLeaf()){
codes.put(root.getValue(),chaineCarac); codes.put(root.getValue(),Integer.parseInt(chaineCarac));
return codes; return codes;
} }
@@ -192,8 +192,8 @@ public class HuffmanTree {
} }
public static Map<Integer,String> getDictionnary(){ public static Map<Integer,Integer> getDictionnary(){
return this.codes; return codes;
} }
+34 -2
View File
@@ -1,4 +1,36 @@
package fr.iutfbleau.sae; package fr.iutfbleau.sae.mimage;
public class Pixel { public class Pixel{
private int r;
private int g;
private int b;
//à completer
public Pixel(){
}
public int getB() {
return b;
}
public int getG() {
return g;
}
public int getR() {
return r;
}
public void setR(int r) {
this.r = r;
}
public void setB(int b) {
this.b = b;
}
public void setG(int g) {
this.g = g;
}
} }
+19 -19
View File
@@ -1,24 +1,24 @@
package fr.iutfbleau.sae; package fr.iutfbleau.sae.mimage;
import java.awt.*;
import java.io.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
public class RGBImage { public class RGBImage {
public BufferedImage chargementDeImage(File f){ private int width;
//verification si le fichier contient quelque chose, si il est exesistant et si c'est un fichier "normal" d'apres la javadoc. private int height;
if (f == null || !f.exists() || !f.isFile()) { private Pixel [] pixels
return null;
} public int getWidth() {
BufferedImage image; return width;
try { }
image = ImageIO.read(f);
} catch (IOExeption e){ public int getHeight() {
return null; return height;
} }
return image;
//a completer encore public Pixel[] getPixels() {
return pixels;
}
public void setPixels(Pixel[] pixels) {
this.pixels = pixels;
} }
} }