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.**
---
## 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ë.
## 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.