Finalisation des interfaces pour les codes + test avec une image

This commit is contained in:
2025-12-27 14:19:04 +01:00
parent 9d925f6782
commit 2dbef96484
19 changed files with 75 additions and 31 deletions
+4 -4
View File
@@ -83,12 +83,12 @@ Objectif : Écriture du format `.pif` + finalisation convertisseur
| US | Assigné | Statut | | Description |
|------------|---------|--------|-----|-------------|
| US-D2 | AA | TODO | 🟥 | Vérifier BitOutputStream avec flux réel |
| US-D2 | AA | DONE | 🟩 | Vérifier BitOutputStream avec flux réel |
| US-C5 | AD | DOING | 🟨 | Implémenter PIFWriter (header + tables + pixels compressés) |
| US-U6 | AD | DOING | 🟨 | Exporter une image en `.pif` |
| US-P1 | AA | TODO | 🟥 | Finaliser affichage des fréquences |
| US-P2 | AA | TODO | 🟥 | Finaliser affichage codes Huffman |
| US-P3 | AA | TODO | 🟥 | Finaliser affichage codes canoniques |
| US-P1 | AA | DONE | 🟩 | Finaliser affichage des fréquences |
| US-P2 | AA | DONE | 🟩 | Finaliser affichage codes Huffman |
| US-P3 | AA | DONE | 🟩 | Finaliser affichage codes canoniques |
| US-U7 | AD | DOING | 🟨 | Implémenter laperçu (PreviewPanel) |
| US-D3..D6 | YB | TODO | 🟥 | Lier interface convertisseur -> compression |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -77,4 +77,8 @@ public class ConverterController {
e.printStackTrace();
}
}
public RGBImage getImage(){
return this.image;
}
}
+51 -7
View File
@@ -1,6 +1,11 @@
package fr.iutfbleau.sae;
import java.util.HashMap;
import java.util.Map;
import fr.iutfbleau.sae.mhuffman.FrequencyTable;
import fr.iutfbleau.sae.mhuffman.HuffmanNode;
import fr.iutfbleau.sae.mhuffman.HuffmanTree;
import fr.iutfbleau.sae.mhuffman.CanonicalCode;
import fr.iutfbleau.sae.mimage.*;
import fr.iutfbleau.sae.vconverter.ConverterWindow;
public class Convertisseur {
@@ -10,10 +15,15 @@ public class Convertisseur {
// je la passe au controleur
ConverterController controller = new ConverterController(window);
controller.loadImage("C:\\Magasin\\COURS\\BUT2\\SAES3\\SAE32_2025\\temp");
//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();
// Exemple d'utilisation pour les codes Huffman
Map<Integer, String> codesRouge = new HashMap<>();
/*Map<Integer, String> codesRouge = new HashMap<>();
codesRouge.put(255, "1010");
codesRouge.put(128, "010");
@@ -43,12 +53,46 @@ public class Convertisseur {
freqB[3] = 12;
// .....
freqB[100] = 212;
freqB[100] = 212;*/
// Appeler la méthode sur l'instance de la fenêtre
window.setCanonicalTable(codesRouge, codesVert, codesBleu);
// 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);
System.out.println("DLKSLDKSLKDSLKSLKSLDKSLDKLSdkslkdl");
// 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);
//System.out.println("DLKSLDKSLKDSLKSLKSLDKSLDKLSdkslkdl");
}
}
@@ -2,17 +2,18 @@ package fr.iutfbleau.sae.mhuffman;
import java.util.*;
public class CanonicalCode{
private Map<Integer, String> codeLengths = new HashMap<>();
private Map<Integer, String> canonicalCodes = new HashMap<>();
//private Map<Integer, String> codeLengths = new HashMap<>();
//private Map<Integer, String> canonicalCodes = new HashMap<>();
public Map<Integer,String> generateCodes(){
public Map<Integer,String> generateCodes(Map<Integer,String> codesHuffman){
// 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
// on recupere les entrées des codes Huffman pour pouvoir les triés
List<Map.Entry<Integer, String>> liste = new ArrayList<>(codeLengths.entrySet());
List<Map.Entry<Integer, String>> liste = new ArrayList<>(codesHuffman.entrySet());
// ici on comparer par longueur de la valeur ou sinon par la clé
@@ -30,7 +31,7 @@ public class CanonicalCode{
}
});
Map<Integer,String> canonicalCodes = new HashMap<>();
int code = 0; // code canonique à attribuer
int temp = 0; //garde la longueur du code précedent , pour gérer le décalage
@@ -55,18 +56,14 @@ public class CanonicalCode{
}
public String getCode(int value){
return this.canonicalCodes.get(value);
public String getCode(Map<Integer,String> canonicalCodes,int value){
return canonicalCodes.get(value);
}
public int getLength(int value){
return this.codeLengths.get(value).length();
public int getLength(Map<Integer,String> codesH,int value){
return codesH.get(value).length();
}
public Map<Integer,String> getCanonicalCodes(){
return this.canonicalCodes;
}
}
@@ -1,5 +1,5 @@
package fr.iutfbleu.sae.util;
package fr.iutfbleau.sae.util;
import fr.iutfbleau.sae.util.BitOutputStream;
import java.io.IOException;
import java.io.OutputStream;
@@ -1,5 +1,4 @@
package fr.iutfbleau.sae.util;
import java.io.IOException;
import java.io.InputStream;
@@ -22,7 +21,7 @@ import java.io.InputStream;
* @version 1.0
* @since 2025-12-13
*/
public class BitInputStream {
public class BitinputStream {
/** Flux d'entrée sous-jacent */
private final InputStream fluxEntree;
@@ -42,7 +41,7 @@ public class BitInputStream {
* @param fluxEntree flux d'entrée à décorer
* @throws IllegalArgumentException si le flux est nul
*/
public BitInputStream(InputStream fluxEntree) {
public BitinputStream(InputStream fluxEntree) {
if (fluxEntree == null) {
throw new IllegalArgumentException("Le flux d'entrée ne peut pas être nul");
}
@@ -129,7 +129,7 @@ public class ConverterWindow extends JFrame {
public void setHuffmanTable(Map<Integer, String> codesRouge,
Map<Integer, String> codesVert,
Map<Integer, String> codesBleu) {
codeTablePanel.updateCanonicalCodes(codesRouge, codesVert, codesBleu);
codeTablePanel.updateCodes(codesRouge, codesVert, codesBleu);
}
/**
@@ -144,6 +144,6 @@ public class ConverterWindow extends JFrame {
public void setCanonicalTable(Map<Integer, String> codesRouge,
Map<Integer, String> codesVert,
Map<Integer, String> codesBleu) {
codeTablePanel.updateCodes(codesRouge, codesVert, codesBleu);
codeTablePanel.updateCanonicalCodes(codesRouge, codesVert, codesBleu);
}
}