diff --git a/build/fr/iutfbleau/sae/ConverterController.class b/build/fr/iutfbleau/sae/ConverterController.class index 0ea386f..067cfca 100644 Binary files a/build/fr/iutfbleau/sae/ConverterController.class and b/build/fr/iutfbleau/sae/ConverterController.class differ diff --git a/build/fr/iutfbleau/sae/Convertisseur.class b/build/fr/iutfbleau/sae/Convertisseur.class index 26dc2eb..33ff8fc 100644 Binary files a/build/fr/iutfbleau/sae/Convertisseur.class and b/build/fr/iutfbleau/sae/Convertisseur.class differ diff --git a/build/fr/iutfbleau/sae/mhuffman/CanonicalCode$1.class b/build/fr/iutfbleau/sae/mhuffman/CanonicalCode$1.class index e6fc9bd..c337e61 100644 Binary files a/build/fr/iutfbleau/sae/mhuffman/CanonicalCode$1.class and b/build/fr/iutfbleau/sae/mhuffman/CanonicalCode$1.class differ diff --git a/build/fr/iutfbleau/sae/mhuffman/CanonicalCode.class b/build/fr/iutfbleau/sae/mhuffman/CanonicalCode.class index d49484e..28611d9 100644 Binary files a/build/fr/iutfbleau/sae/mhuffman/CanonicalCode.class and b/build/fr/iutfbleau/sae/mhuffman/CanonicalCode.class differ diff --git a/build/fr/iutfbleau/sae/vconverter/ConverterWindow.class b/build/fr/iutfbleau/sae/vconverter/ConverterWindow.class index af2a1ef..192e5e9 100644 Binary files a/build/fr/iutfbleau/sae/vconverter/ConverterWindow.class and b/build/fr/iutfbleau/sae/vconverter/ConverterWindow.class differ diff --git a/build/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.class b/build/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.class index 892a660..7dff39f 100644 Binary files a/build/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.class and b/build/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.class differ diff --git a/makefile b/makefile index cd7daf2..44ef038 100644 --- a/makefile +++ b/makefile @@ -81,7 +81,6 @@ $(BIN)/$(PKG_PATH)/vconverter/ConverterWindow.class: $(BIN) \ $(BIN)/$(PKG_PATH)/vconverter/ImagePreviewPanel.class \ $(BIN)/$(PKG_PATH)/vconverter/FrequencyTablePanel.class \ $(BIN)/$(PKG_PATH)/vconverter/CodeTablePanel.class \ - $(BIN)/$(PKG_PATH)/util/Config.class \ $(SRC)/$(PKG_PATH)/vconverter/ConverterWindow.java $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/vconverter/ConverterWindow.java @@ -112,9 +111,6 @@ $(BIN)/$(PKG_PATH)/ConverterController.class: $(BIN) \ #Compilation des classes util -$(BIN)/$(PKG_PATH)/util/Config.class: $(BIN) \ - $(SRC)/$(PKG_PATH)/util/Config.java - $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/util/Config.java $(BIN)/$(PKG_PATH)/util/ByteUtils.class: $(BIN) \ $(SRC)/$(PKG_PATH)/util/ByteUtils.java $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/util/ByteUtils.java diff --git a/src/fr/iutfbleau/sae/ConverterController.java b/src/fr/iutfbleau/sae/ConverterController.java index 3095bd2..2229c20 100644 --- a/src/fr/iutfbleau/sae/ConverterController.java +++ b/src/fr/iutfbleau/sae/ConverterController.java @@ -1,6 +1,7 @@ package fr.iutfbleau.sae; import fr.iutfbleau.sae.mhuffman.CanonicalCode; import fr.iutfbleau.sae.mhuffman.FrequencyTable; +import fr.iutfbleau.sae.mhuffman.HuffmanTree; import fr.iutfbleau.sae.mimage.Pixel; import fr.iutfbleau.sae.mimage.RGBImage; import fr.iutfbleau.sae.vconverter.ConverterWindow; @@ -30,9 +31,9 @@ public class ConverterController { private Map abrHuffmanB; // Codes canoniques pour chaque composante - private CanonicalCode canonRED; - private CanonicalCode canonGREEN; - private CanonicalCode canonBLUE; + private Map canonRED; + private Map canonGREEN; + private Map canonBLUE; // La fenêtre du convertisseur private ConverterWindow fen; @@ -78,6 +79,65 @@ public class ConverterController { } } + + public void computeFrequencies() { + + if (this.image == null) { + System.err.println("Aucune image chargée pour le calcul des fréquences."); + return; + } + + this.frequencyTable = new FrequencyTable(); + this.frequencyTable.computeFromImage(this.image); + + // Mettre à jour le GUI avec les fréquences + int[] freqR = this.frequencyTable.getRed(); + int[] freqG = this.frequencyTable.getGreen(); + int[] freqB = this.frequencyTable.getBlue(); + this.fen.setFrequencyTable(freqR, freqG, freqB); + } + + + public void computeHuffman() { + + if (this.frequencyTable == null) { + System.err.println("Les fréquences ne sont pas encore calculées."); + return; + } + + // Génération des arbres de Huffman pour chaque composante et stockage des codes + HuffmanTree arbreR = new HuffmanTree(this.frequencyTable.getRed()); + this.abrHuffmanR = arbreR.generateCodes(); + HuffmanTree arbreG = new HuffmanTree(this.frequencyTable.getGreen()); + this.abrHuffmanG = arbreG.generateCodes(); + HuffmanTree arbreB = new HuffmanTree(this.frequencyTable.getBlue()); + this.abrHuffmanB = arbreB.generateCodes(); + + // Mettre à jour le GUI avec les codes de Huffman + this.fen.setHuffmanTable(this.abrHuffmanR, this.abrHuffmanG, this.abrHuffmanB); + } + + public void computeCanonical() { + if (this.abrHuffmanR == null || this.abrHuffmanG == null || this.abrHuffmanB == null) { + System.err.println("Les codes de Huffman doivent être générés d'abord."); + return; + } + + CanonicalCode codeCanoniques = new CanonicalCode(); + this.canonRED = codeCanoniques.generateCodes(this.abrHuffmanR); + this.canonGREEN = codeCanoniques.generateCodes(this.abrHuffmanG); + this.canonBLUE = codeCanoniques.generateCodes(this.abrHuffmanB); + + // Mettre à jour le GUI avec les codes canoniques + this.fen.setCanonicalTable(this.canonRED, this.canonGREEN, this.canonBLUE); + + } + + + public void saveAsPIF(String filepath) { + // À implémenter : sauvegarder l'image convertie au format PIF + } + public RGBImage getImage(){ return this.image; } diff --git a/src/fr/iutfbleau/sae/Convertisseur.java b/src/fr/iutfbleau/sae/Convertisseur.java index 8f10acb..6e048bd 100644 --- a/src/fr/iutfbleau/sae/Convertisseur.java +++ b/src/fr/iutfbleau/sae/Convertisseur.java @@ -12,84 +12,19 @@ public class Convertisseur { public static void main(String[] args) { // Créer et stocker la référence à la fenêtre ConverterWindow window = new ConverterWindow(); - // je la passe au controleur ConverterController controller = new ConverterController(window); - //controller.loadImage("C:\\Magasin\\COURS\\BUT2\\SAES3\\SAE32_2025\\temp"); - // à changer selon votre OS en conséquence ! - String s = "temp/photo.jpg"; - controller.loadImage(s); - RGBImage image = controller.getImage(); + // chemin de l'image de test + String testIMG = "temp/test1.jpg"; + controller.loadImage(testIMG); // je charge l'image - // Exemple d'utilisation pour les codes Huffman - /*Map codesRouge = new HashMap<>(); - codesRouge.put(255, "1010"); - codesRouge.put(128, "010"); + // Logique de conversion dans lordre + controller.computeFrequencies(); + controller.computeHuffman(); + controller.computeCanonical(); + - Map codesVert = new HashMap<>(); - codesVert.put(255, "110"); - codesVert.put(128, "01"); - Map codesBleu = new HashMap<>(); - codesBleu.put(255, "0"); - codesBleu.put(128, "10"); - - // Exemple d'utilisation pour les tables de fréquence : ne pas tenir compte des valeurs !! - - int[] freqR = new int[256]; - freqR[0] = 20078; - freqR[1] = 4789622; - // ........ - freqR[155] = 2246666; - - int[] freqG = new int[256]; - freqG[0] = 1255752; - freqG[2] = 622; - // ........ - freqG[200] = 0; - - - int[] freqB = new int[256]; - freqB[3] = 12; - // ..... - - freqB[100] = 212;*/ - - - // Appeler la méthode sur l'instance de la fenêtre - // Essayons d'appeler les méthodes sur une vrai image désormais : - - // Premierement essayons la table de fréquence : - - - FrequencyTable frequence = new FrequencyTable(); - frequence.computeFromImage(image); - int[] freqR = frequence.getRed(); - int[] freqG = frequence.getGreen(); - int[] freqB = frequence.getBlue(); - window.setFrequencyTable(freqR,freqG,freqB); - - // Passons désormais aux codes Huffman : - - HuffmanTree arbreR = new HuffmanTree(freqR); - Map codesHuffR = arbreR.generateCodes(); - - HuffmanTree arbreG = new HuffmanTree(freqG); - Map codesHuffG = arbreG.generateCodes(); - - HuffmanTree arbreB = new HuffmanTree(freqB); - Map codesHuffB = arbreB.generateCodes(); - window.setHuffmanTable(codesHuffR,codesHuffG,codesHuffB); - - // Passons désormais aux codes canoniques : - - CanonicalCode codeCanoniques = new CanonicalCode(); - - Map codesCanoniqueRouges = codeCanoniques.generateCodes(codesHuffR); - Map codesCanoniqueGreen = codeCanoniques.generateCodes(codesHuffG); - Map codesCanoniqueBleu = codeCanoniques.generateCodes(codesHuffB); - - window.setCanonicalTable(codesCanoniqueRouges, codesCanoniqueGreen, codesCanoniqueBleu); diff --git a/src/fr/iutfbleau/sae/mhuffman/CanonicalCode.java b/src/fr/iutfbleau/sae/mhuffman/CanonicalCode.java index 4699b26..06a2497 100644 --- a/src/fr/iutfbleau/sae/mhuffman/CanonicalCode.java +++ b/src/fr/iutfbleau/sae/mhuffman/CanonicalCode.java @@ -16,7 +16,10 @@ public class CanonicalCode{ List> liste = new ArrayList<>(codesHuffman.entrySet()); // ici on comparer par longueur de la valeur ou sinon par la clé - + + + + // =============== ATTENTION CLASSE ANONYME !!!!!!! ================ Collections.sort(liste, new Comparator>() { @Override public int compare(Map.Entry arg1 ,Map.Entry arg2) { diff --git a/src/fr/iutfbleau/sae/util/Config.java b/src/fr/iutfbleau/sae/util/Config.java deleted file mode 100644 index ae91ab0..0000000 --- a/src/fr/iutfbleau/sae/util/Config.java +++ /dev/null @@ -1,15 +0,0 @@ -package fr.iutfbleau.sae.util; -public class Config { - public static final String CON_NAME = "SAE32 - Convertisseur d'images PIF"; - public static final String VIS_NAME = "SAE32 - Visualiseur d'images PIF"; - public static final int[] VISUALISEUR_FENETRE_TAILLE = {800, 600}; - public static final int[] CONVERTISSEUR_FENETRE_TAILLE = {800, 600}; - public static final String APP_COPYRIGHT = "2025 © IUT de Fontainebleau"; - public static final String APP_AUTHOR = "IUT de Fontainebleau"; - - - private Config() { - // je refuse l'instanciation - } - -} diff --git a/src/fr/iutfbleau/sae/util/GestErreur.java b/src/fr/iutfbleau/sae/util/GestErreur.java index 86e4a22..da4779a 100644 --- a/src/fr/iutfbleau/sae/util/GestErreur.java +++ b/src/fr/iutfbleau/sae/util/GestErreur.java @@ -1,5 +1,8 @@ package fr.iutfbleau.sae.util; public class GestErreur { - -} + public static void erreur(String message) { + System.err.println("Erreur : " + message); + System.exit(1); + } +} \ No newline at end of file diff --git a/src/fr/iutfbleau/sae/vconverter/ConverterWindow.java b/src/fr/iutfbleau/sae/vconverter/ConverterWindow.java index c2c1fe7..75e75f3 100644 --- a/src/fr/iutfbleau/sae/vconverter/ConverterWindow.java +++ b/src/fr/iutfbleau/sae/vconverter/ConverterWindow.java @@ -37,15 +37,12 @@ public class ConverterWindow extends JFrame { */ public ConverterWindow() { - - System.out.println("Création de la fenêtre : " + Config.CON_NAME); // debug // Configuration de la fenetre - this.setTitle(Config.CON_NAME); - this.setSize(Config.CONVERTISSEUR_FENETRE_TAILLE[0], - Config.CONVERTISSEUR_FENETRE_TAILLE[1]); + this.setTitle("Convertisseur PIF - Visualisation des données"); + this.setSize(900, 600); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLocationRelativeTo(null); // Centre la fenêtre - this.setResizable(true); // on autorise le resize (plus moderne) + this.setResizable(true); // on autorise le resize // Initialisation des panels @@ -56,8 +53,8 @@ public class ConverterWindow extends JFrame { // Je gere le panel principal JPanel contentPanel = new JPanel(); contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS)); - contentPanel.setBackground(new Color(255, 0, 0)); // rouge vif pour demo - contentPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15)); + //contentPanel.setBackground(new Color(255, 0, 0)); // rouge vif pour demo + contentPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); // Titre JLabel header = new JLabel(" Convertisseur PIF – Visualisation des données "); @@ -65,18 +62,17 @@ public class ConverterWindow extends JFrame { header.setAlignmentX(Component.CENTER_ALIGNMENT); contentPanel.add(header); - contentPanel.add(Box.createRigidArea(new Dimension(0, 20))); // espace + contentPanel.add(Box.createRigidArea(new Dimension(0, 5))); // espace - - // Ajout du panel d’aperçu + // Ajout du panel d'aperçu contentPanel.add(imagePreviewPanel); - contentPanel.add(Box.createRigidArea(new Dimension(0, 20))); + contentPanel.add(Box.createRigidArea(new Dimension(0, 5))); // Ajout du panel des fréquences contentPanel.add(frequencyTablePanel); - contentPanel.add(Box.createRigidArea(new Dimension(0, 20))); + contentPanel.add(Box.createRigidArea(new Dimension(0, 5))); // Ajout panel des codes contentPanel.add(codeTablePanel); - contentPanel.add(Box.createRigidArea(new Dimension(0, 20))); + contentPanel.add(Box.createRigidArea(new Dimension(0, 5))); // la section du scrollpane JScrollPane scrollPane = new JScrollPane(contentPanel); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); diff --git a/src/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.java b/src/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.java index 79f05c8..803e11c 100644 --- a/src/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.java +++ b/src/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.java @@ -18,8 +18,8 @@ public class ImagePreviewPanel extends JPanel { // je donne une taille préférée au panel public ImagePreviewPanel() { - this.setPreferredSize(new Dimension(800, 300)); - this.setMinimumSize(new Dimension(800, 300)); + this.setPreferredSize(new Dimension(600, 800)); + this.setMinimumSize(new Dimension(600, 800)); } diff --git a/temp/photo.jpg b/temp/photo.jpg deleted file mode 100644 index f5c8714..0000000 Binary files a/temp/photo.jpg and /dev/null differ diff --git a/temp/test1.jpg b/temp/test1.jpg new file mode 100644 index 0000000..4bfced4 Binary files /dev/null and b/temp/test1.jpg differ