Un éditeur d'images moderne et extensible basé sur HTML5 Canvas
Image Editor est un éditeur d'images web moderne et intuitif développé en JavaScript vanilla. Conçu avec une architecture modulaire basée sur des plugins, il offre une expérience utilisateur fluide et des fonctionnalités d'édition avancées directement dans le navigateur.
- 🚀 Performance optimisée - Rendu basé sur HTML5 Canvas
- 🔧 Architecture modulaire - Système de plugins extensible
- ⚡ Interface réactive - Design moderne et intuitif
- 🎨 Outils complets - Rotation, recadrage, filtres, dessin, formes et texte
- ⏮️ Historique complet - Undo/Redo avec raccourcis clavier
- 💾 Sauvegarde simple - Export direct en PNG
- Import - Chargement d'images depuis l'ordinateur
- Export - Sauvegarde en format PNG haute qualité
- Historique - Système undo/redo avec 20 niveaux
- Rotation - Rotation 90° droite/gauche
- Recadrage - Sélection et découpe précise
- Redimensionnement - Ajustement des dimensions
- Pinceau - Dessin libre avec options avancées
- Couleurs personnalisables
- Taille variable (1-50px)
- Types de brosse (rond/carré)
- Contrôle d'opacité
- Formes - Rectangles, cercles, lignes
- Texte - Ajout de texte avec formatage
- Luminosité - Ajustement -100 à +100
- Contraste - Contrôle précis du contraste
- Saturation - Modification de l'intensité des couleurs
- Teinte - Rotation des couleurs (-180° à +180°)
- Flou - Effet de flou gaussien (0-10px)
- Navigateur web moderne (Chrome, Firefox, Safari, Edge)
- Serveur web local (optionnel pour développement)
- Cloner le repository
git clone https://github.com/pascal1132/image-editor.git
cd image-editor- Lancer l'application
# Option 1: Serveur local simple
python -m http.server 8000
# Option 2: Node.js
npx serve .
# Option 3: Live Server (VS Code)
# Installer l'extension Live Server et clic droit sur index.html- Ouvrir dans le navigateur
http://localhost:8000
| Raccourci | Action |
|---|---|
Ctrl + Z |
Annuler (Undo) |
Ctrl + Shift + Z |
Rétablir (Redo) |
Ctrl + Y |
Rétablir (Redo) |
Ctrl + S |
Sauvegarder |
Escape |
Fermer le panneau plugin |
1-9 |
Sélectionner plugin (raccourci numérique) |
- Charger une image - Cliquer sur "Charger" et sélectionner un fichier
- Appliquer des transformations - Utiliser les outils de rotation/recadrage
- Ajouter des effets - Ajuster les filtres selon vos besoins
- Dessiner ou annoter - Utiliser le pinceau ou ajouter du texte
- Sauvegarder - Exporter le résultat final
image-editor/
├── index.html # Point d'entrée principal
├── main.js # Core de l'éditeur + classe BasePlugin
├── style.css # Styles de l'interface
├── plugins/ # Plugins modulaires
│ ├── rotate.js # Plugin de rotation
│ ├── crop.js # Plugin de recadrage
│ ├── brush.js # Plugin de dessin
│ ├── text.js # Plugin de texte
│ ├── filters.js # Plugin de filtres
│ └── shapes.js # Plugin de formes
└── README.md # Documentation
Chaque plugin hérite de la classe BasePlugin et implémente :
class MonPlugin extends BasePlugin {
get name() { return 'Mon Plugin'; }
get icon() { return 'fa-icon-class'; }
getUI() {
// Retourne les contrôles de l'interface
return [
{ type: 'button', label: 'Action', action: () => this.action() }
];
}
// Méthodes optionnelles
onMouseDown(x, y) { /* Gestion souris */ }
onMouseMove(x, y, isDown) { /* Gestion mouvement */ }
onMouseUp(x, y) { /* Fin d'interaction */ }
prepareForSaving() { /* Préparation sauvegarde */ }
}button- Boutons d'actionrange- Sliders de valeurscolor- Sélecteurs de couleurtext- Champs de textenumber- Champs numériquesselect- Listes déroulantescheckbox- Cases à cocher
- Créer le fichier plugin
// plugins/mon-plugin.js
class MonPlugin extends BasePlugin {
get name() { return 'Mon Plugin'; }
get icon() { return 'fa-solid fa-star'; }
getUI() {
return [
{
type: 'button',
label: 'Mon Action',
action: () => this.monAction()
}
];
}
monAction() {
// Logique du plugin
this.editor.saveToHistory(); // Sauvegarder l'état
}
}- Ajouter le script dans index.html
<script src="plugins/mon-plugin.js"></script>- Enregistrer le plugin
new ImageEditor('#container', {
plugins: [RotatePlugin, CropPlugin, /* ... */, MonPlugin]
});- Utiliser
this.editor.saveToHistory()avant les modifications - Implémenter
prepareForSaving()si nécessaire - Gérer les événements souris pour l'interactivité
- Suivre les conventions de nommage des classes
Les contributions sont les bienvenues ! Voici comment participer :
- Fork le projet
- Créer une branche feature (
git checkout -b feature/nouvelle-fonctionnalite) - Commiter les changements (
git commit -m 'Ajout nouvelle fonctionnalité') - Push vers la branche (
git push origin feature/nouvelle-fonctionnalite) - Ouvrir une Pull Request
- 🐛 Bug fixes - Correction de bugs
- ✨ Nouvelles fonctionnalités - Nouveaux plugins ou outils
- 📚 Documentation - Amélioration de la documentation
- 🎨 UI/UX - Améliorations de l'interface
- ⚡ Performance - Optimisations
- Plugin de forme libre (courbes de Bézier)
- Plugin de dégradés
- Plugin d'effets avancés (ombre, relief)
- Plugin de calques
- Plugin d'export multi-format
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
- Font Awesome - Icônes de l'interface
- Google Fonts - Police Inter
- HTML5 Canvas API - Rendu graphique
- Communauté open source - Inspiration et support
Développé avec ❤️ par [Pascal]
⭐ Star ce projet • 🐛 Reporter un bug • 💡 Suggérer une fonctionnalité