Finalisation des interfaces pour les codes + test avec une image
This commit is contained in:
+4
-4
@@ -83,12 +83,12 @@ Objectif : Écriture du format `.pif` + finalisation convertisseur
|
|||||||
|
|
||||||
| US | Assigné | Statut | | Description |
|
| 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-C5 | AD | DOING | 🟨 | Implémenter PIFWriter (header + tables + pixels compressés) |
|
||||||
| US-U6 | AD | DOING | 🟨 | Exporter une image en `.pif` |
|
| US-U6 | AD | DOING | 🟨 | Exporter une image en `.pif` |
|
||||||
| US-P1 | AA | TODO | 🟥 | Finaliser affichage des fréquences |
|
| US-P1 | AA | DONE | 🟩 | Finaliser affichage des fréquences |
|
||||||
| US-P2 | AA | TODO | 🟥 | Finaliser affichage codes Huffman |
|
| US-P2 | AA | DONE | 🟩 | Finaliser affichage codes Huffman |
|
||||||
| US-P3 | AA | TODO | 🟥 | Finaliser affichage codes canoniques |
|
| US-P3 | AA | DONE | 🟩 | Finaliser affichage codes canoniques |
|
||||||
| US-U7 | AD | DOING | 🟨 | Implémenter l’aperçu (PreviewPanel) |
|
| US-U7 | AD | DOING | 🟨 | Implémenter l’aperçu (PreviewPanel) |
|
||||||
| US-D3..D6 | YB | TODO | 🟥 | Lier interface convertisseur -> compression |
|
| 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.
Binary file not shown.
Binary file not shown.
@@ -77,4 +77,8 @@ public class ConverterController {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public RGBImage getImage(){
|
||||||
|
return this.image;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
package fr.iutfbleau.sae;
|
package fr.iutfbleau.sae;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
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;
|
import fr.iutfbleau.sae.vconverter.ConverterWindow;
|
||||||
public class Convertisseur {
|
public class Convertisseur {
|
||||||
@@ -10,10 +15,15 @@ public class Convertisseur {
|
|||||||
|
|
||||||
// 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");
|
//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
|
// 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(255, "1010");
|
||||||
codesRouge.put(128, "010");
|
codesRouge.put(128, "010");
|
||||||
|
|
||||||
@@ -43,12 +53,46 @@ public class Convertisseur {
|
|||||||
freqB[3] = 12;
|
freqB[3] = 12;
|
||||||
// .....
|
// .....
|
||||||
|
|
||||||
freqB[100] = 212;
|
freqB[100] = 212;*/
|
||||||
|
|
||||||
|
|
||||||
// Appeler la méthode sur l'instance de la fenêtre
|
// Appeler la méthode sur l'instance de la fenêtre
|
||||||
window.setCanonicalTable(codesRouge, codesVert, codesBleu);
|
// 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);
|
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.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class CanonicalCode{
|
public class CanonicalCode{
|
||||||
private Map<Integer, String> codeLengths = new HashMap<>();
|
//private Map<Integer, String> codeLengths = new HashMap<>();
|
||||||
private Map<Integer, String> canonicalCodes = 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)
|
// 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
|
// 2eme chose à faire : remettre dans l'ordre des longueurs : si meme taille ==> regarder valeur
|
||||||
// 3eme chose à faire : ecriture des codes canoniques
|
// 3eme chose à faire : ecriture des codes canoniques
|
||||||
|
|
||||||
// on recupere les entrées des codes Huffman pour pouvoir les triés
|
// 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é
|
// 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 code = 0; // code canonique à attribuer
|
||||||
int temp = 0; //garde la longueur du code précedent , pour gérer le décalage
|
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){
|
public String getCode(Map<Integer,String> canonicalCodes,int value){
|
||||||
return this.canonicalCodes.get(value);
|
return canonicalCodes.get(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getLength(int value){
|
public int getLength(Map<Integer,String> codesH,int value){
|
||||||
return this.codeLengths.get(value).length();
|
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.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
package fr.iutfbleau.sae.util;
|
package fr.iutfbleau.sae.util;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
||||||
@@ -22,7 +21,7 @@ import java.io.InputStream;
|
|||||||
* @version 1.0
|
* @version 1.0
|
||||||
* @since 2025-12-13
|
* @since 2025-12-13
|
||||||
*/
|
*/
|
||||||
public class BitInputStream {
|
public class BitinputStream {
|
||||||
|
|
||||||
/** Flux d'entrée sous-jacent */
|
/** Flux d'entrée sous-jacent */
|
||||||
private final InputStream fluxEntree;
|
private final InputStream fluxEntree;
|
||||||
@@ -42,7 +41,7 @@ public class BitInputStream {
|
|||||||
* @param fluxEntree flux d'entrée à décorer
|
* @param fluxEntree flux d'entrée à décorer
|
||||||
* @throws IllegalArgumentException si le flux est nul
|
* @throws IllegalArgumentException si le flux est nul
|
||||||
*/
|
*/
|
||||||
public BitInputStream(InputStream fluxEntree) {
|
public BitinputStream(InputStream fluxEntree) {
|
||||||
if (fluxEntree == null) {
|
if (fluxEntree == null) {
|
||||||
throw new IllegalArgumentException("Le flux d'entrée ne peut pas être nul");
|
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,
|
public void setHuffmanTable(Map<Integer, String> codesRouge,
|
||||||
Map<Integer, String> codesVert,
|
Map<Integer, String> codesVert,
|
||||||
Map<Integer, String> codesBleu) {
|
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,
|
public void setCanonicalTable(Map<Integer, String> codesRouge,
|
||||||
Map<Integer, String> codesVert,
|
Map<Integer, String> codesVert,
|
||||||
Map<Integer, String> codesBleu) {
|
Map<Integer, String> codesBleu) {
|
||||||
codeTablePanel.updateCodes(codesRouge, codesVert, codesBleu);
|
codeTablePanel.updateCanonicalCodes(codesRouge, codesVert, codesBleu);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user