finition
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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
|
||||
|
||||
@@ -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<Integer, String> abrHuffmanB;
|
||||
|
||||
// Codes canoniques pour chaque composante
|
||||
private CanonicalCode canonRED;
|
||||
private CanonicalCode canonGREEN;
|
||||
private CanonicalCode canonBLUE;
|
||||
private Map<Integer, String> canonRED;
|
||||
private Map<Integer, String> canonGREEN;
|
||||
private Map<Integer, String> 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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
// 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é
|
||||
|
||||
|
||||
|
||||
// =============== ATTENTION CLASSE ANONYME !!!!!!! ================
|
||||
Collections.sort(liste, new Comparator<Map.Entry<Integer, String>>() {
|
||||
@Override
|
||||
public int compare(Map.Entry<Integer, String> arg1 ,Map.Entry<Integer, String> arg2) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 703 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 574 KiB |
Reference in New Issue
Block a user