This commit is contained in:
AlgaLaptop
2025-12-28 00:50:00 +01:00
parent 27ec290315
commit 608853fcfe
16 changed files with 92 additions and 114 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
-4
View File
@@ -81,7 +81,6 @@ $(BIN)/$(PKG_PATH)/vconverter/ConverterWindow.class: $(BIN) \
$(BIN)/$(PKG_PATH)/vconverter/ImagePreviewPanel.class \ $(BIN)/$(PKG_PATH)/vconverter/ImagePreviewPanel.class \
$(BIN)/$(PKG_PATH)/vconverter/FrequencyTablePanel.class \ $(BIN)/$(PKG_PATH)/vconverter/FrequencyTablePanel.class \
$(BIN)/$(PKG_PATH)/vconverter/CodeTablePanel.class \ $(BIN)/$(PKG_PATH)/vconverter/CodeTablePanel.class \
$(BIN)/$(PKG_PATH)/util/Config.class \
$(SRC)/$(PKG_PATH)/vconverter/ConverterWindow.java $(SRC)/$(PKG_PATH)/vconverter/ConverterWindow.java
$(JAVAC) -cp $(BIN) -d $(BIN) $(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 #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) \ $(BIN)/$(PKG_PATH)/util/ByteUtils.class: $(BIN) \
$(SRC)/$(PKG_PATH)/util/ByteUtils.java $(SRC)/$(PKG_PATH)/util/ByteUtils.java
$(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/util/ByteUtils.java $(JAVAC) -cp $(BIN) -d $(BIN) $(SRC)/$(PKG_PATH)/util/ByteUtils.java
+63 -3
View File
@@ -1,6 +1,7 @@
package fr.iutfbleau.sae; package fr.iutfbleau.sae;
import fr.iutfbleau.sae.mhuffman.CanonicalCode; import fr.iutfbleau.sae.mhuffman.CanonicalCode;
import fr.iutfbleau.sae.mhuffman.FrequencyTable; import fr.iutfbleau.sae.mhuffman.FrequencyTable;
import fr.iutfbleau.sae.mhuffman.HuffmanTree;
import fr.iutfbleau.sae.mimage.Pixel; import fr.iutfbleau.sae.mimage.Pixel;
import fr.iutfbleau.sae.mimage.RGBImage; import fr.iutfbleau.sae.mimage.RGBImage;
import fr.iutfbleau.sae.vconverter.ConverterWindow; import fr.iutfbleau.sae.vconverter.ConverterWindow;
@@ -30,9 +31,9 @@ public class ConverterController {
private Map<Integer, String> abrHuffmanB; private Map<Integer, String> abrHuffmanB;
// Codes canoniques pour chaque composante // Codes canoniques pour chaque composante
private CanonicalCode canonRED; private Map<Integer, String> canonRED;
private CanonicalCode canonGREEN; private Map<Integer, String> canonGREEN;
private CanonicalCode canonBLUE; private Map<Integer, String> canonBLUE;
// La fenêtre du convertisseur // La fenêtre du convertisseur
private ConverterWindow fen; 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(){ public RGBImage getImage(){
return this.image; return this.image;
} }
+9 -74
View File
@@ -12,84 +12,19 @@ public class Convertisseur {
public static void main(String[] args) { public static void main(String[] args) {
// Créer et stocker la référence à la fenêtre // Créer et stocker la référence à la fenêtre
ConverterWindow window = new ConverterWindow(); ConverterWindow window = new ConverterWindow();
// je la passe au controleur // je la passe au controleur
ConverterController controller = new ConverterController(window); ConverterController controller = new ConverterController(window);
//controller.loadImage("C:\\Magasin\\COURS\\BUT2\\SAES3\\SAE32_2025\\temp");
// à changer selon votre OS en conséquence ! // chemin de l'image de test
String s = "temp/photo.jpg"; String testIMG = "temp/test1.jpg";
controller.loadImage(s); controller.loadImage(testIMG); // je charge l'image
RGBImage image = controller.getImage();
// Logique de conversion dans lordre
controller.computeFrequencies();
controller.computeHuffman();
controller.computeCanonical();
// Exemple d'utilisation pour les codes Huffman
/*Map<Integer, String> codesRouge = new HashMap<>();
codesRouge.put(255, "1010");
codesRouge.put(128, "010");
Map<Integer, String> codesVert = new HashMap<>();
codesVert.put(255, "110");
codesVert.put(128, "01");
Map<Integer, String> 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<Integer,String> codesHuffR = arbreR.generateCodes();
HuffmanTree arbreG = new HuffmanTree(freqG);
Map<Integer,String> codesHuffG = arbreG.generateCodes();
HuffmanTree arbreB = new HuffmanTree(freqB);
Map<Integer,String> codesHuffB = arbreB.generateCodes();
window.setHuffmanTable(codesHuffR,codesHuffG,codesHuffB);
// Passons désormais aux codes canoniques :
CanonicalCode codeCanoniques = new CanonicalCode();
Map<Integer,String> codesCanoniqueRouges = codeCanoniques.generateCodes(codesHuffR);
Map<Integer,String> codesCanoniqueGreen = codeCanoniques.generateCodes(codesHuffG);
Map<Integer,String> codesCanoniqueBleu = codeCanoniques.generateCodes(codesHuffB);
window.setCanonicalTable(codesCanoniqueRouges, codesCanoniqueGreen, codesCanoniqueBleu);
@@ -17,6 +17,9 @@ public class CanonicalCode{
// ici on comparer par longueur de la valeur ou sinon par la clé // ici on comparer par longueur de la valeur ou sinon par la clé
// =============== ATTENTION CLASSE ANONYME !!!!!!! ================
Collections.sort(liste, new Comparator<Map.Entry<Integer, String>>() { Collections.sort(liste, new Comparator<Map.Entry<Integer, String>>() {
@Override @Override
public int compare(Map.Entry<Integer, String> arg1 ,Map.Entry<Integer, String> arg2) { public int compare(Map.Entry<Integer, String> arg1 ,Map.Entry<Integer, String> arg2) {
-15
View File
@@ -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
}
}
+4 -1
View File
@@ -1,5 +1,8 @@
package fr.iutfbleau.sae.util; package fr.iutfbleau.sae.util;
public class GestErreur { public class GestErreur {
public static void erreur(String message) {
System.err.println("Erreur : " + message);
System.exit(1);
}
} }
@@ -37,15 +37,12 @@ public class ConverterWindow extends JFrame {
*/ */
public ConverterWindow() { public ConverterWindow() {
System.out.println("Création de la fenêtre : " + Config.CON_NAME); // debug
// Configuration de la fenetre // Configuration de la fenetre
this.setTitle(Config.CON_NAME); this.setTitle("Convertisseur PIF - Visualisation des données");
this.setSize(Config.CONVERTISSEUR_FENETRE_TAILLE[0], this.setSize(900, 600);
Config.CONVERTISSEUR_FENETRE_TAILLE[1]);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null); // Centre la fenêtre 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 // Initialisation des panels
@@ -56,8 +53,8 @@ public class ConverterWindow extends JFrame {
// Je gere le panel principal // Je gere le panel principal
JPanel contentPanel = new JPanel(); JPanel contentPanel = new JPanel();
contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS)); contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
contentPanel.setBackground(new Color(255, 0, 0)); // rouge vif pour demo //contentPanel.setBackground(new Color(255, 0, 0)); // rouge vif pour demo
contentPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15)); contentPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
// Titre // Titre
JLabel header = new JLabel(" Convertisseur PIF Visualisation des données "); JLabel header = new JLabel(" Convertisseur PIF Visualisation des données ");
@@ -65,18 +62,17 @@ public class ConverterWindow extends JFrame {
header.setAlignmentX(Component.CENTER_ALIGNMENT); header.setAlignmentX(Component.CENTER_ALIGNMENT);
contentPanel.add(header); 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 daperçu
contentPanel.add(imagePreviewPanel); 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 // Ajout du panel des fréquences
contentPanel.add(frequencyTablePanel); contentPanel.add(frequencyTablePanel);
contentPanel.add(Box.createRigidArea(new Dimension(0, 20))); contentPanel.add(Box.createRigidArea(new Dimension(0, 5)));
// Ajout panel des codes // Ajout panel des codes
contentPanel.add(codeTablePanel); contentPanel.add(codeTablePanel);
contentPanel.add(Box.createRigidArea(new Dimension(0, 20))); contentPanel.add(Box.createRigidArea(new Dimension(0, 5)));
// la section du scrollpane // la section du scrollpane
JScrollPane scrollPane = new JScrollPane(contentPanel); JScrollPane scrollPane = new JScrollPane(contentPanel);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
@@ -18,8 +18,8 @@ public class ImagePreviewPanel extends JPanel {
// je donne une taille préférée au panel // je donne une taille préférée au panel
public ImagePreviewPanel() { public ImagePreviewPanel() {
this.setPreferredSize(new Dimension(800, 300)); this.setPreferredSize(new Dimension(600, 800));
this.setMinimumSize(new Dimension(800, 300)); this.setMinimumSize(new Dimension(600, 800));
} }
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 703 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 574 KiB