# Projet : Primitive Image Format (PIF)

## Description générale

Ce projet consiste à implémenter un nouveau format d’image compressé sans perte, appelé **PIF (Primitive Image Format)**, inspiré du format JFIF.  
Il s'appuie sur la création de tables de fréquences, de codes de Huffman, de codes canoniques et sur la manipulation binaire afin de réduire la taille des images.

Deux programmes Java doivent être développés :

1. **Visualisateur PIF**  
   Programme capable d’ouvrir un fichier `.pif` et d’afficher l’image dans une interface graphique.

2. **Convertisseur vers PIF**  
   Programme permettant de charger une image classique (ImageIO), de générer ses tables de fréquences et codes associés, puis de produire un fichier `.pif`.

Ce travail doit être réalisé en binôme ou trinôme.

---

## Deadline

**Date limite de rendu : dimanche 11 janvier 2025 à 23h59.**  
Toutes les sources doivent être présentes sur le serveur Gitea du département dans un dépôt privé nommé **SAE32_2025**.

---

## Fonctionnalités attendues

### 1. Visualisateur `.pif`

- Lecture du fichier `.pif` via argument de ligne de commande ou `JFileChooser`.
- Décodage :
  - de l’en-tête (largeur, hauteur),
  - des trois tables canoniques (R, G, B),
  - des données binaires des pixels.
- Affichage graphique sous Swing :
  - fenêtre redimensionnable,
  - image centrée si petite,
  - image déplaçable à la souris si trop grande.

---

### 2. Convertisseur vers format `.pif`

- Chargement d'une image via `ImageIO.read()`.
- Extraction :
  - des tables de fréquences,
  - des codes Huffman initiaux,
  - des codes canoniques triés.
- Affichage des tables pour inspection.
- Génération du fichier `.pif` :
  - en-tête,
  - tables canoniques compactes,
  - données binaires des pixels encodés.
- Le deuxième argument de ligne de commande peut définir le nom du fichier `.pif`.

---

## Structure du format PIF

Un fichier `.pif` contient trois sections :  

1. **En-tête (4 octets)**  
   - largeur (2 octets)  
   - hauteur (2 octets)

2. **Tables canoniques (768 octets)**  
   Trois tables successives de 256 octets : rouge, vert, bleu.  
   Chaque octet indique la longueur du code canonique d’une valeur entre 0 et 255.

3. **Section pixels (à partir du 773e octet)**  
   Les trois composantes (R, G, B) sont encodées via leurs codes canoniques respectifs.  
   Les bits sont packés de manière contiguë.

---

## Processus de compression

### 1. Création des tables de fréquences

Pour R, G et B : compter combien de fois chaque valeur apparaît dans l’image.

### 2. Construction des codes Huffman

- Un arbre est construit par composante.
- Les valeurs les plus fréquentes reçoivent les codes les plus courts.
- Les codes initiaux peuvent varier en longueur.

### 3. Génération des codes canoniques

- Tri des valeurs par longueur de code puis par valeur.
- Premier code : rempli de zéros.
- Les suivants sont obtenus par incrément binaire.
- Permet une reconstruction simple côté visualisateur.

---

## Architecture logicielle

Le projet doit inclure :

- un package Java unique,
- toutes les classes nécessaires au traitement :
  - gestion du fichier PIF,
  - lecture/écriture binaire,
  - génération des fréquences,
  - Huffman,
  - codes canoniques,
  - interface graphique,
  - programme principal du visualisateur,
  - programme principal du convertisseur.
- un `Makefile` générant deux exécutables `.jar`.

---

## Classes Java

Les classes Java utilisées dans le projet :

- [BitinputStream](src/fr/iutfbleau/sae/util/BitinputStream.java)
- [BitOutputStream](src/fr/iutfbleau/sae/util/BitOutputStream.java)
- [ByteUtils](src/fr/iutfbleau/sae/util/ByteUtils.java)
- [CanonicalCode](src/fr/iutfbleau/sae/mhuffman/CanonicalCode.java)
- [FrequencyTable](src/fr/iutfbleau/sae/mhuffman/FrequencyTable.java)
- [HuffmanNode](src/fr/iutfbleau/sae/mhuffman/HuffmanNode.java)
- [HuffmanTree](src/fr/iutfbleau/sae/mhuffman/HuffmanTree.java)

---

## Rapport à produire

Un rapport PDF doit contenir :

- noms des membres du groupe,
- introduction résumant le sujet,
- description des fonctionnalités du programme,
- captures d’écran,
- diagrammes UML simplifiés,
- explication du compresseur (Huffman, canoniques, structure du fichier),
- explication du décompresseur,
- conclusion personnelle de chaque membre.

Le rapport ne doit pas contenir de code source.

---

## Compilation et exécution

### Visualisateur
    java -jar pif-viewer.jar chemin/image.pif


### Convertisseur
    java -jar pif-converter.jar image.png sortie.pif


Si aucun argument n’est fourni, un `JFileChooser` est ouvert.

---


- Les commits, leur fréquence et la collaboration seront pris en compte dans la note.

---

## Auteurs

- Algassimou Pellel DIALLO
- Ayoub ANHDIRE
- Youness BOULALAME

## Enseignant
- Luc HERNANDEZ

