diff --git a/PlaningDeTavail.md b/PlaningDeTavail.md index d81adf2..ed897bf 100644 --- a/PlaningDeTavail.md +++ b/PlaningDeTavail.md @@ -27,8 +27,8 @@ Objectif : Mise en place des fondations techniques | US-U5 | YB | DOING | 🟨 | Chargement d’image via ImageIO | | US-D8 | YB | TODO | 🟥 | Structure RGBImage + Pixel | | US-P1 | AA | TODO | 🟥 | Interface simple d’affichage des fréquences | -| US-P2 | AD | DOING | 🟨 | Interface simple d’affichage Huffman | -| US-P3 | AA | TODO | 🟥 | Interface simple d’affichage canoniques | +| US-P2 | AD | DONE | 🟩 | Interface simple d’affichage codes Huffman | +| US-P3 | AA | TODO | 🟥 | Interface simple d’affichage codes canoniques | ## Fichiers à créer – Sprint 1 @@ -83,14 +83,14 @@ Objectif : Écriture du format `.pif` + finalisation convertisseur | US | Assigné | Statut | | Description | |------------|---------|--------|-----|-------------| -| US-D2 | AD | TODO | 🟥 | Vérifier BitOutputStream avec flux réel | +| US-D2 | AA | TODO | 🟥 | Vérifier BitOutputStream avec flux réel | | US-C5 | AD | TODO | 🟥 | Implémenter PIFWriter (header + tables + pixels compressés) | | US-U6 | AD | TODO | 🟥 | Exporter une image en `.pif` | | US-P1 | AA | TODO | 🟥 | Finaliser affichage des fréquences | -| US-P2 | YB | TODO | 🟥 | Finaliser affichage codes Huffman | +| US-P2 | AA | TODO | 🟥 | Finaliser affichage codes Huffman | | US-P3 | AA | TODO | 🟥 | Finaliser affichage codes canoniques | -| US-U7 | YB | TODO | 🟥 | Implémenter l’aperçu (PreviewPanel) | -| US-D3..D6 | YB | TODO | 🟥 | Lier interface convertisseur ↔ compression | +| US-U7 | AD | TODO | 🟥 | Implémenter l’aperçu (PreviewPanel) | +| US-D3..D6 | YB | TODO | 🟥 | Lier interface convertisseur -> compression | ## Fichiers à créer – Sprint 2 @@ -102,7 +102,7 @@ Objectif : Écriture du format `.pif` + finalisation convertisseur ### `src/vconverter/` (complément) | Nom du fichier | Rôle | US | |----------------|-------|----| -| `SavePanel.java` *(optionnel)* | Interface de sauvegarde `.pif` | US-U6 | +| `SavePanel.java` en option a voir | Interface de sauvegarde `.pif` | US-U6 | --- diff --git a/build/fr/iutfbleau/sae/Convertisseur.class b/build/fr/iutfbleau/sae/Convertisseur.class index fab0003..b8560cb 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/Viewer.class b/build/fr/iutfbleau/sae/Viewer.class new file mode 100644 index 0000000..e537982 Binary files /dev/null and b/build/fr/iutfbleau/sae/Viewer.class differ diff --git a/build/fr/iutfbleau/sae/util/Config.class b/build/fr/iutfbleau/sae/util/Config.class new file mode 100644 index 0000000..704c718 Binary files /dev/null and b/build/fr/iutfbleau/sae/util/Config.class differ diff --git a/build/fr/iutfbleau/sae/vconverter/CodeTablePanel.class b/build/fr/iutfbleau/sae/vconverter/CodeTablePanel.class new file mode 100644 index 0000000..bac22c3 Binary files /dev/null and b/build/fr/iutfbleau/sae/vconverter/CodeTablePanel.class differ diff --git a/build/fr/iutfbleau/sae/vconverter/ConverterWindow.class b/build/fr/iutfbleau/sae/vconverter/ConverterWindow.class new file mode 100644 index 0000000..7f1b56e Binary files /dev/null and b/build/fr/iutfbleau/sae/vconverter/ConverterWindow.class differ diff --git a/build/fr/iutfbleau/sae/vconverter/FrequencyTablePanel.class b/build/fr/iutfbleau/sae/vconverter/FrequencyTablePanel.class new file mode 100644 index 0000000..98950d8 Binary files /dev/null and b/build/fr/iutfbleau/sae/vconverter/FrequencyTablePanel.class differ diff --git a/build/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.class b/build/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.class new file mode 100644 index 0000000..0386a82 Binary files /dev/null and b/build/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.class differ diff --git a/makefile b/makefile index 6d8bea3..3c959df 100644 --- a/makefile +++ b/makefile @@ -25,15 +25,18 @@ endif # Règle par défaut all: \ - $(BIN)/$(PKG_PATH)/Convertisseur.class + $(BIN)/$(PKG_PATH)/Convertisseur.class \ $(BIN)/$(PKG_PATH)/Viewer.class -# Compilation -$(BIN)/$(PKG_PATH)/Convertisseur.class: $(BIN) - $(JAVAC) -d $(BIN) $(SRC)/$(PKG_PATH)/Convertisseur.java - -$(BIN)/$(PKG_PATH)/Viewer.class: $(BIN) - $(JAVAC) -d $(BIN) $(SRC)/$(PKG_PATH)/Viewer.java +# Compilation des classes main +$(BIN)/$(PKG_PATH)/Convertisseur.class: $(BIN) \ + $(BIN)/$(PKG_PATH)/vconverter/ConverterWindow.class \ + $(SRC)/$(PKG_PATH)/Convertisseur.java + $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/Convertisseur.java + +$(BIN)/$(PKG_PATH)/Viewer.class: $(BIN) \ + $(SRC)/$(PKG_PATH)/Viewer.java + $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/Viewer.java # Dossiers $(BIN): @@ -42,12 +45,53 @@ $(BIN): $(DOC): mkdir -p $(DOC) +#Compilation de l'interface graphique je compile converterWindow +$(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 + +# ConverterWindow dépend des autres classes je les compile aussi +$(BIN)/$(PKG_PATH)/vconverter/ImagePreviewPanel.class: $(BIN) \ + $(SRC)/$(PKG_PATH)/vconverter/ImagePreviewPanel.java + $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/vconverter/ImagePreviewPanel.java + +$(BIN)/$(PKG_PATH)/vconverter/FrequencyTablePanel.class: $(BIN) \ + $(SRC)/$(PKG_PATH)/vconverter/FrequencyTablePanel.java + $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/vconverter/FrequencyTablePanel.java + +$(BIN)/$(PKG_PATH)/vconverter/CodeTablePanel.class: $(BIN) \ + $(SRC)/$(PKG_PATH)/vconverter/CodeTablePanel.java + $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/vconverter/CodeTablePanel.java + + +#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 + +$(BIN)/$(PKG_PATH)/util/BitInputStream.class: $(BIN) \ + $(SRC)/$(PKG_PATH)/util/BitInputStream.java + $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/util/BitInputStream.java + +$(BIN)/$(PKG_PATH)/util/BitOutputStream.class: $(BIN) \ + $(SRC)/$(PKG_PATH)/util/BitOutputStream.java + $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/util/BitOutputStream.java + + # Exécution run-conv: all - $(JAVA) -cp $(BIN)$(SEP)$(LIB)* $(MAIN_CONVERTER) + $(JAVA) -cp $(BIN) $(MAIN_CONVERTER) run-view: all - $(JAVA) -cp $(BIN)$(SEP)$(LIB)* $(MAIN_VIEWER) + $(JAVA) -cp $(BIN) $(MAIN_VIEWER) # Documentation doc: $(DOC) diff --git a/src/fr/iutfbleau/sae/Convertisseur.java b/src/fr/iutfbleau/sae/Convertisseur.java index 20251ec..5459ff4 100644 --- a/src/fr/iutfbleau/sae/Convertisseur.java +++ b/src/fr/iutfbleau/sae/Convertisseur.java @@ -1,7 +1,29 @@ package fr.iutfbleau.sae; +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import fr.iutfbleau.sae.vconverter.CodeTablePanel; +import fr.iutfbleau.sae.vconverter.ConverterWindow; public class Convertisseur { - public File convertion(String chemin, String nom) public static void main(String[] args) { + // Créer et stocker la référence à la fenêtre + ConverterWindow window = new ConverterWindow(); + + // Exemple d'utilisation pour les codes Huffman + Map codesRouge = new HashMap<>(); + codesRouge.put(255, "1010"); + codesRouge.put(128, "010"); + + Map codesVert = new HashMap<>(); + codesVert.put(255, "110"); + codesVert.put(128, "01"); + Map codesBleu = new HashMap<>(); + codesBleu.put(255, "0"); + codesBleu.put(128, "10"); + + // Appeler la méthode sur l'instance de la fenêtre + window.setCanonicalTable(codesRouge, codesVert, codesBleu); System.out.println("DLKSLDKSLKDSLKSLKSLDKSLDKLSdkslkdl"); } -} +} \ No newline at end of file diff --git a/src/fr/iutfbleau/sae/util/Config.java b/src/fr/iutfbleau/sae/util/Config.java new file mode 100644 index 0000000..ae91ab0 --- /dev/null +++ b/src/fr/iutfbleau/sae/util/Config.java @@ -0,0 +1,15 @@ +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/vconverter/CodeTablePanel.java b/src/fr/iutfbleau/sae/vconverter/CodeTablePanel.java new file mode 100644 index 0000000..340a228 --- /dev/null +++ b/src/fr/iutfbleau/sae/vconverter/CodeTablePanel.java @@ -0,0 +1,110 @@ +package fr.iutfbleau.sae.vconverter; + +import javax.swing.*; +import java.awt.*; +import java.util.Map; + +/** + * Panneau d'affichage des codes Huffman et canoniques. + * Affiche les codes pour chaque composante de couleur (rouge, vert, bleu). + * @author Algassimou + */ +public class CodeTablePanel extends JPanel { + + // Zones de texte pour les codes Huffman + private JTextArea textHuffRouge, textHuffVert, textHuffBleu; + + // Zones de texte pour les codes canoniques + private JTextArea textCanonRouge, textCanonVert, textCanonBleu; + + /** + * Constructeur qui initialise l'interface utilisateur. + */ + public CodeTablePanel() { + setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15)); + + // Titre pour les codes Huffman + JLabel titreHuff = new JLabel("Codes Huffman"); + titreHuff.setFont(new Font("SansSerif", Font.BOLD, 16)); + add(titreHuff); + add(Box.createVerticalStrut(10)); + + // Création des zones de texte pour les codes Huffman + textHuffRouge = creerZoneTexte("Rouge"); + textHuffVert = creerZoneTexte("Vert"); + textHuffBleu = creerZoneTexte("Bleu"); + + // Séparateur + add(Box.createVerticalStrut(20)); + + // Titre pour les codes canoniques + JLabel titreCanon = new JLabel("Codes Canoniques"); + titreCanon.setFont(new Font("SansSerif", Font.BOLD, 16)); + add(titreCanon); + add(Box.createVerticalStrut(10)); + + // Création des zones de texte pour les codes canoniques + textCanonRouge = creerZoneTexte("Rouge (Canonique)"); + textCanonVert = creerZoneTexte("Vert (Canonique)"); + textCanonBleu = creerZoneTexte("Bleu (Canonique)"); + } + + /** + * Crée une zone de texte avec une étiquette. + * @param titre Le titre à afficher au-dessus de la zone de texte + * @return La zone de texte configurée + */ + private JTextArea creerZoneTexte(String titre) { + add(new JLabel(titre + ":")); + JTextArea zone = new JTextArea(8, 30); + zone.setEditable(false); + zone.setFont(new Font("Monospaced", Font.PLAIN, 12)); + JScrollPane scroll = new JScrollPane(zone); + scroll.setPreferredSize(new Dimension(300, 120)); + add(scroll); + add(Box.createVerticalStrut(10)); + return zone; + } + + /** + * Met à jour l'affichage des codes Huffman. + * @param rouge Les codes pour la composante rouge + * @param vert Les codes pour la composante verte + * @param bleu Les codes pour la composante bleue + */ + public void updateCodes(Map rouge, + Map vert, + Map bleu) { + mettreAJourZoneTexte(textHuffRouge, rouge); + mettreAJourZoneTexte(textHuffVert, vert); + mettreAJourZoneTexte(textHuffBleu, bleu); + } + + /** + * Met à jour l'affichage des codes canoniques. + * @param rouge Les codes pour la composante rouge + * @param vert Les codes pour la composante verte + * @param bleu Les codes pour la composante bleue + */ + public void updateCanonicalCodes(Map rouge, + Map vert, + Map bleu) { + mettreAJourZoneTexte(textCanonRouge, rouge); + mettreAJourZoneTexte(textCanonVert, vert); + mettreAJourZoneTexte(textCanonBleu, bleu); + } + + /** + * Met à jour le contenu d'une zone de texte avec les codes fournis. + * @param zone La zone de texte à mettre à jour + * @param codes Les codes à afficher + */ + private void mettreAJourZoneTexte(JTextArea zone, Map codes) { + StringBuilder sb = new StringBuilder(); + for (Map.Entry entry : codes.entrySet()) { + sb.append(String.format("%3d : %s%n", entry.getKey(), entry.getValue())); + } + zone.setText(sb.toString()); + } +} \ 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 6b44bf4..e5e77dc 100644 --- a/src/fr/iutfbleau/sae/vconverter/ConverterWindow.java +++ b/src/fr/iutfbleau/sae/vconverter/ConverterWindow.java @@ -1,49 +1,120 @@ package fr.iutfbleau.sae.vconverter; + +import javax.swing.*; +import java.awt.*; +import java.util.Map; + +import fr.iutfbleau.sae.util.Config; + /** * Fenêtre principale du convertisseur. * *

- * Cette classe représente la vue principale de l’application. - * Elle regroupe les différents panneaux graphiques utilisés - * pour afficher les résultats de la conversion d’une image. + * Cette classe correspond à la vue principale de l’application. + * Elle centralise l’affichage des informations liées à la conversion + * d’une image (aperçu, fréquences, codes). *

* * + *

+ * Elle sert de point d’entrée unique pour la partie graphique + *

*/ -public class ConverterWindow { - +public class ConverterWindow extends JFrame { private ImagePreviewPanel imagePreviewPanel; private FrequencyTablePanel frequencyTablePanel; private CodeTablePanel codeTablePanel; + + /** - * Met à jour l’aperçu de l’image affichée dans la fenêtre. + * Crée la fenêtre principale du convertisseur. * *

- * Cette méthode est appelée par le contrôleur après le chargement - * de l’image. L’image reçue est simplement transmise - * au panneau d’aperçu pour être affichée. + * Le constructeur initialise la fenêtre et met en place + * les différents panneaux graphiques utilisés pour l’affichage. + *

+ */ + + 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.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.setLocationRelativeTo(null); // Centre la fenêtre + this.setResizable(true); // on autorise le resize (plus moderne) + + + // Initialisation des panels + this.imagePreviewPanel = new ImagePreviewPanel(); + this.frequencyTablePanel = new FrequencyTablePanel(); + this.codeTablePanel = new CodeTablePanel(); + + // 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)); + + // Titre + JLabel header = new JLabel(" Convertisseur PIF – Visualisation des données "); + header.setFont(new Font("SansSerif", Font.BOLD, 18)); + header.setAlignmentX(Component.CENTER_ALIGNMENT); + contentPanel.add(header); + + contentPanel.add(Box.createRigidArea(new Dimension(0, 20))); // espace + + + // Ajout du panel d’aperçu + contentPanel.add(imagePreviewPanel); + contentPanel.add(Box.createRigidArea(new Dimension(0, 20))); + // Ajout du panel des fréquences + contentPanel.add(frequencyTablePanel); + contentPanel.add(Box.createRigidArea(new Dimension(0, 20))); + // Ajout panel des codes + contentPanel.add(codeTablePanel); + contentPanel.add(Box.createRigidArea(new Dimension(0, 20))); + // la section du scrollpane + JScrollPane scrollPane = new JScrollPane(contentPanel); + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + scrollPane.getVerticalScrollBar().setUnitIncrement(16); // scroll plus adouci fluide + + this.add(scrollPane); + this.setVisible(true); // toi meme tu sais + } + + + + /** + * Met à jour l’image affichée dans la zone d’aperçu. + * + *

+ * Cette méthode est appelée lorsque l’image à convertir + * a été chargée. La fenêtre ne modifie pas l’image : + * elle la transmet simplement au panneau d’aperçu. *

* - * @param img image à afficher dans l’aperçu + * @param img image à afficher */ public void setImagePreview(Object img) { - // mise à jour du ImagePreviewPanel avec l’image img imagePreviewPanel.setImage(img); } /** - * Met à jour les tables de fréquences des composantes R, G et B. + * Met à jour l’affichage des tables de fréquences. * *

- * Cette méthode reçoit les tableaux de fréquences calculés - * par le contrôleur et les transmet au panneau chargé - * de les afficher. + * Les fréquences sont déjà calculées avant l’appel + * de cette méthode. La fenêtre se contente de demander + * au panneau dédié de rafraîchir son affichage. *

*/ public void setFrequencyTable() { - // mise à jour des fréquences dans le FrequencyTablePanel frequencyTablePanel.updateFrequencies(); } @@ -51,27 +122,29 @@ public class ConverterWindow { * Met à jour l’affichage des codes Huffman. * *

- * Les codes sont déjà calculés par le contrôleur. - * Cette méthode se contente de demander au panneau - * des codes de les afficher. + * Cette méthode ne génère aucun code. + * Elle permet uniquement d’afficher les codes + * qui ont été produits par la partie traitement. *

*/ - public void setHuffmanTable() { - // mise à jour des codes Huffman dans le CodeTablePanel - codeTablePanel.updateCodes(); + public void setHuffmanTable(Map codesRouge, + Map codesVert, + Map codesBleu) { + codeTablePanel.updateCanonicalCodes(codesRouge, codesVert, codesBleu); } /** * Met à jour l’affichage des codes canoniques. * *

- * Cette méthode est utilisée après la génération - * des codes canoniques (Sprint 2). - * Elle ne fait aucun calcul et se limite à l’affichage. + * Les codes canoniques sont transmis au panneau + * chargé de leur affichage. Aucune vérification + * ni transformation n’est effectuée ici. *

*/ - public void setCanonicalTable() { - // mise à jour des codes canoniques dans le CodeTablePanel - codeTablePanel.updateCanonicalCodes(); + public void setCanonicalTable(Map codesRouge, + Map codesVert, + Map codesBleu) { + codeTablePanel.updateCodes(codesRouge, codesVert, codesBleu); } } diff --git a/src/fr/iutfbleau/sae/vconverter/FrequencyTablePanel.java b/src/fr/iutfbleau/sae/vconverter/FrequencyTablePanel.java index f7b26e3..c5f902f 100644 --- a/src/fr/iutfbleau/sae/vconverter/FrequencyTablePanel.java +++ b/src/fr/iutfbleau/sae/vconverter/FrequencyTablePanel.java @@ -1,5 +1,13 @@ package fr.iutfbleau.sae.vconverter; -public class FrequencyTablePanel { - +import javax.swing.*; + +public class FrequencyTablePanel extends JPanel { + public FrequencyTablePanel() { + // constructeur vide pour l'instant + } + + public void updateFrequencies() { + // Implémentation à ajouter + } } diff --git a/src/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.java b/src/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.java new file mode 100644 index 0000000..404e111 --- /dev/null +++ b/src/fr/iutfbleau/sae/vconverter/ImagePreviewPanel.java @@ -0,0 +1,22 @@ +package fr.iutfbleau.sae.vconverter; + + import javax.swing.JPanel; + + /** + * Le panneau d’aperçu de l’image. + * + *

+ * Ce panneau affiche un aperçu de l’image en cours de conversion. + *

+ */ + + +public class ImagePreviewPanel extends JPanel { + public ImagePreviewPanel() { + // constructeur vide pour l'instant + } + + public void setImage(Object img) { + // Implémentation à ajouter + } +} \ No newline at end of file