finir le sprint 3

This commit is contained in:
AlgaLaptop
2026-01-04 18:05:46 +01:00
parent bceb70c052
commit 182cd2bd28
10 changed files with 163 additions and 118 deletions
+7 -6
View File
@@ -1,13 +1,11 @@
package fr.iutfbleau.sae.mpif;
import fr.iutfbleau.sae.mimage.RGBImage;
import fr.iutfbleau.sae.util.BitInputStream;
import fr.iutfbleau.sae.util.BitOutputStream;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.util.Map;
import fr.iutfbleau.sae.mimage.RGBImage;
public class PIFReader {
@@ -19,8 +17,11 @@ public class PIFReader {
public RGBImage read(String filepath)
throws Exception {
// j'Utilise d'un BufferedInputStream pour une meilleure performance
FileInputStream fis = new FileInputStream(filepath);
BitInputStream lecteur = new BitInputStream(fis);
BufferedInputStream bis = new BufferedInputStream(fis);
BitInputStream lecteur = new BitInputStream(bis);
// je lis l'entête et les tables canoniques
this.readHeader(lecteur);
@@ -42,7 +43,7 @@ public class PIFReader {
}
public void readHeader(BitInputStream in) {
// TODO: Implement header reading
}
public void readCanonicalTables(BitInputStream in) {
+65 -51
View File
@@ -1,6 +1,7 @@
package fr.iutfbleau.sae.mpif;
import fr.iutfbleau.sae.mimage.RGBImage;
import fr.iutfbleau.sae.mimage.Pixel;
import fr.iutfbleau.sae.util.BitOutputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
@@ -16,9 +17,9 @@ public class PIFWriter {
throws Exception {
// Création du flux de sortie binaire
FileOutputStream fos =new FileOutputStream(filepath);
BufferedOutputStream bos =new BufferedOutputStream(fos);
BitOutputStream ecriveur =new BitOutputStream(bos);
FileOutputStream fos = new FileOutputStream(filepath);
BufferedOutputStream bos = new BufferedOutputStream(fos);
BitOutputStream ecriveur = new BitOutputStream(bos);
// Écriture de l'en-tête
writeHeader(ecriveur, image.getWidth(), image.getHeight());
@@ -31,96 +32,109 @@ public class PIFWriter {
ecriveur.fermerFlux();
System.err.println("SYSTEME");
System.out.println("Fichier PIF écrit avec succès");
}
// Ecriture de l'en-tête du fichier PIF (largeur et hauteur)
public void writeHeader(BitOutputStream out,int width, int height){
public void writeHeader(BitOutputStream out, int width, int height) {
try {
out.writeBits(width >> 8 & 0xFF, 8); // octet de poids fort
out.writeBits(width & 0xFF, 8); // octet de poids faible
out.writeBits(height >> 8 & 0xFF, 8); // octet de poids fort
out.writeBits(height & 0xFF, 8); // octet de poids faible
out.writeBits(width, 16); // ✅ Simplifié : 16 bits d'un coup
out.writeBits(height, 16); // ✅ Simplifié : 16 bits d'un coup
} catch (Exception e) {
System.err.println("Erreur lors de lécriture de len-tête du fichier PIF");
System.err.println("Erreur lors de l'écriture de l'en-tête du fichier PIF");
}
}
public void writeTables(BitOutputStream out, Map<Integer, String> canonR,
Map<Integer, String> canonG, Map<Integer, String> canonB){
Map<Integer, String> canonG, Map<Integer, String> canonB) {
try {
// Écriture des longueurs des codes canoniques pour chaque composante
for (int i = 0; i < 256; i++) {
int len;
if (canonR.containsKey(i)) { // petite securité (au cas où)
if (canonR.containsKey(i)) {
len = canonR.get(i).length();
}else {
} else {
len = 0;
}
out.writeBits(len, 8);
out.writeBits(len, 8);
}
for (int i = 0; i < 256; i++) {
int len;
if (canonG.containsKey(i)) {
len = canonG.get(i).length();
}else {
} else {
len = 0;
}
out.writeBits(len, 8);
out.writeBits(len, 8);
}
for (int i = 0; i < 256; i++) {
int len;
if (canonB.containsKey(i)) {
len = canonB.get(i).length();
}else {
} else {
len = 0;
}
out.writeBits(len, 8);
}
} catch (IOException e) {
System.err.println("Erreur lors de lécriture des tables de fréquences dans le fichier PIF");
System.err.println("Erreur lors de l'écriture des tables de fréquences dans le fichier PIF");
}
}
private void writeBitFromString(BitOutputStream out, String code){
try {
for (int i = 0; i < code.length(); i++) {
if (code.charAt(i) == '1') {
out.writeBit(1);
} else {
out.writeBit(0);
}
// Debug pour compter les symboles utilisés et calculer les longueurs moyennes
int totalBitsR = 0, totalBitsG = 0, totalBitsB = 0;
int countR = 0, countG = 0, countB = 0;
for (int i = 0; i < 256; i++) {
if (canonR.containsKey(i)) {
totalBitsR += canonR.get(i).length();
countR++;
}
if (canonG.containsKey(i)) {
totalBitsG += canonG.get(i).length();
countG++;
}
if (canonB.containsKey(i)) {
totalBitsB += canonB.get(i).length();
countB++;
}
} catch (IOException e) {
System.err.println("Erreur lors de l’écriture des bits dans le fichier PIF");
}
System.out.println("Longueur moyenne Rouge : " + (totalBitsR / (double)countR));
System.out.println("Longueur moyenne Vert : " + (totalBitsG / (double)countG));
System.out.println("Longueur moyenne Bleu : " + (totalBitsB / (double)countB));
System.out.println("Symboles utilisés - R:" + countR + " G:" + countG + " B:" + countB);
}
// Méthode pour encoder les pixels de l'image en utilisant les codes canoniques
public void encodePixels(BitOutputStream out, RGBImage image, Map<Integer, String> canonRED, Map<Integer, String> canonGREEN, Map<Integer, String> canonBLUE){
public void encodePixels(BitOutputStream out, RGBImage image,
Map<Integer, String> canonRED,
Map<Integer, String> canonGREEN,
Map<Integer, String> canonBLUE) {
int width = image.getWidth();
int height = image.getHeight();
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
// Récupérer les valeurs R, G, B du pixel
int r = image.getPixel(x, y).getR();
int g = image.getPixel(x, y).getG();
int b = image.getPixel(x, y).getB();
// Écrire les codes dans le flux binaire
writeBitFromString(out, canonRED.get(r));
writeBitFromString(out, canonGREEN.get(g));
writeBitFromString(out, canonBLUE.get(b));
}
}
}
try {
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
// Récupérer le pixel une seule fois pour optimiser
Pixel pixel = image.getPixel(x, y);
int r = pixel.getR();
int g = pixel.getG();
int b = pixel.getB();
}
// OPTIMISATION : Utiliser writeBitString() directement
out.writeBitString(canonRED.get(r));
out.writeBitString(canonGREEN.get(g));
out.writeBitString(canonBLUE.get(b));
}
}
} catch (IOException e) {
System.err.println("Erreur lors de l'écriture des pixels dans le fichier PIF");
}
}
}