Professional image metadata analysis and management platform with modern GUI and powerful CLI
A production-grade Java application for analyzing, managing, and tracking image metadata with professional-grade features including EXIF/XMP extraction, intelligent search, snapshot comparison, and a modern Material Design interface.
- Metadata Extraction: Comprehensive EXIF and XMP metadata parsing
- Smart Search: Filter images by filename, date, dimensions with persistent criteria
- Snapshot System: Track directory changes with SHA-256 integrity verification
- Batch Operations: Multi-select for efficient bulk operations
- Cross-Platform: Full Windows, macOS, and Linux support
- Material Design: Beautiful dark theme with smooth animations
- Lazy Loading: Async thumbnail generation with progress feedback
- Live Search: Real-time filtering with visual criteria display
- Empty States: Contextual placeholders and helpful messages
- Responsive: Adapts to different screen sizes
- Production Logging: Async file logging with configurable levels (TRACE β FATAL)
- Internationalization: English, French, Spanish with auto-detection
- Thread Safety: Concurrent operations with proper synchronization
- Error Handling: Comprehensive exception handling throughout
- Resource Management: Automatic cleanup and memory management
Java 17 or higher (required)
Make (optional, recommended)# Clone repository
git clone https://github.com/yourusername/ImageMetadataManager.git
cd ImageMetadataManager
# Build the project
make build
# Launch GUI
make run-guiThe application automatically detects your system language (EN/FR/ES). If unsupported, a language selection dialog appears on first launch.
To add your screenshot: Place your GUI image at docs/images/gui-screenshot.png in your repository
The graphical interface features:
- Modern Material Design: Dark theme with intuitive controls
- Thumbnail Grid: Visual preview of all images in directory
- Search Panel: Real-time filtering with multiple criteria
- Metadata Viewer: Detailed EXIF/XMP information display
- Snapshot Manager: Track and compare directory changes
- Action Bar: Quick access to common operations
Launch the application:
java -jar dist/ImageMetadataManager.jar
# or
make run-guiCore Operations:
- Browse Directory: Click "Choose Directory" to analyze a folder
- Search Images:
- Click "Search" button
- Enter criteria (name, year, dimensions)
- Results display in main grid with thumbnails
- Search criteria shown in action bar
- Clear Search: Click "Clear Search" to reset filters
- Snapshot & Compare:
- "Take Snapshot" saves current state
- "Compare Snapshot" shows changes (new/modified/deleted)
- View Metadata: Double-click any image thumbnail
- Batch Actions: Single-click to select, use "Delete Selected" or "Modify Selected"
Search Features:
- Criteria persist across searches
- Visual indicator shows active filters
- Clear button resets all criteria
- Results update instantly in grid
Empty States:
- Loading: "Loading images..." placeholder
- No images: "π No images found in this directory"
- No results: "π No images match your search criteria"
# Show help
java -jar dist/ImageMetadataManager.jar --cli --help
# Directory operations
java -jar dist/ImageMetadataManager.jar --cli -d /path/to/images --list
java -jar dist/ImageMetadataManager.jar --cli -d /path/to/images --stat
java -jar dist/ImageMetadataManager.jar --cli -d /path/to/images --compare-snapshot
# File operations
java -jar dist/ImageMetadataManager.jar --cli -f image.jpg --info
java -jar dist/ImageMetadataManager.jar --cli -f image.jpg --stat
# Search
java -jar dist/ImageMetadataManager.jar --cli --search /path name=vacation
java -jar dist/ImageMetadataManager.jar --cli --search /path dimensions=1920x1080
# Snapshots
java -jar dist/ImageMetadataManager.jar --cli --snapshotsave /path/to/imagesThe project uses GNU Make for build automation. All build commands are defined in the Makefile.
make help # Display all available commands with descriptions
make build # Compile source code and copy resources
make clean # Remove all build artifacts (build/ and dist/)
make test # Run all unit tests with JUnit
make package # Create executable JAR (runs tests first)make package-no-test # Create JAR without running tests (faster)
make release # Production build (clean + package)
make everything # Full build with documentation (clean + package + docs)
make run-gui # Compile and launch GUI mode
make run-cli # Compile and launch CLI mode with help
make docs # Generate JavaDoc documentationDevelopment Build:
make clean build test # Clean build with testing
make run-gui # Launch for testingQuick Iteration:
make build # Compile changes
make run-gui # Test changesProduction Release:
make release # Creates dist/ImageMetadataManager.jar
# or for complete release with docs
make everything # Includes JavaDoc generationTesting Only:
make test # Run test suiteSkip Tests (Development):
make package-no-test # Fast JAR creation without tests| Output | Location | Description |
|---|---|---|
| Compiled classes | build/classes/ |
Java bytecode |
| Test classes | build/test-classes/ |
Test bytecode |
| Test reports | build/test-reports/ |
JUnit XML reports |
| JavaDoc | build/docs/ |
API documentation |
| Executable JAR | dist/ImageMetadataManager.jar |
Deployable artifact |
The build system uses the following configuration (defined in Makefile):
JAVA_VERSION = 17 # Minimum Java version
JAVAC_FLAGS = --release 17 -Xlint:all -Xlint:-this-escape
MAIN_CLASS = com.imagemeta.Main # Entry pointCompiler Flags:
--release 17: Ensures Java 17 compatibility-Xlint:all: Enable all compiler warnings-Xlint:-this-escape: Suppress this-escape warnings
com.imagemeta/
βββ core/ # Business logic
β βββ ImageFile # Image file representation
β βββ DirectoryAnalyzer # Directory statistics
β βββ SnapshotManager # Change tracking
βββ metadata/ # Metadata extraction
β βββ ImageMetadata # Base metadata
β βββ ExifMetadata # EXIF implementation
β βββ XmpMetadata # XMP implementation
βββ ui/
β βββ cli/ # Command-line interface
β βββ gui/ # Graphical interface
β βββ GraphicalInterface # Main window
β βββ dialogs/ # Modal dialogs
βββ util/ # Utilities
βββ logging/ # Production logger
βββ i18n/ # Internationalization
βββ terminal/ # ANSI colors
Stored in ~/.imagemeta/preferences.properties:
language=en # Selected language
language.configured=true # First-run completedLogs written to logs/imagemeta.log:
[2025-01-15 14:30:22.123] [INFO] [GraphicalInterface.chooseDirectory:245] Directory selected
Log Levels:
TRACE: Detailed diagnosticsDEBUG: Debug informationINFO: General messages (default)WARN: WarningsERROR: ErrorsFATAL: Critical failures
Change programmatically: Logger.setLevel(LogLevel.DEBUG)
- English (EN) π¬π§
- FranΓ§ais (FR) π«π·
- EspaΓ±ol (ES) πͺπΈ
- Create
src/main/resources/i18n/messages_XX.properties - Translate all keys from
messages_en.properties - Add locale to
Localization.java:private static final List<Locale> SUPPORTED = Arrays.asList( Locale.ENGLISH, Locale.FRENCH, new Locale("es"), new Locale("XX") );
- Update
LanguageSelectionDialog.getDisplay()for display name
Language selection is remembered after first configuration. Change anytime via Settings menu.
make test # All tests via Makefile
./scripts/test.sh --quick # Skip slow tests
./scripts/test.sh --verbose # Detailed output
./scripts/test.sh --coverage # Coverage report| Component | Tests | Coverage |
|---|---|---|
| ImageFile | 11 | 95% |
| DirectoryAnalyzer | 20 | 90% |
| SnapshotManager | 12 | 85% |
| Localization | 8 | 80% |
| Utilities | 16 | 85% |
80+ tests covering core functionality, edge cases, and error conditions.
Standard Release:
make release
# Output: dist/ImageMetadataManager.jarComplete Release with Documentation:
make everything
# Output: dist/ImageMetadataManager.jar + build/docs/GUI Mode (default):
java -jar dist/ImageMetadataManager.jar
# or
java -jar dist/ImageMetadataManager.jar --guiCLI Mode:
java -jar dist/ImageMetadataManager.jar --cli
java -jar dist/ImageMetadataManager.jar --cli --helpDebug Mode:
java -jar dist/ImageMetadataManager.jar --debug --guiContributions are welcome! Please follow these guidelines:
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Write tests for new functionality
- Build and test:
make clean build test - Update documentation and i18n files
- Commit changes:
git commit -m 'Add amazing feature' - Push to branch:
git push origin feature/amazing-feature - Open a Pull Request
- Use Java 17+ features and modern idioms
- Follow existing code style and conventions
- Add JavaDoc comments for all public APIs
- Maintain test coverage above 80%
- Update i18n property files for UI text changes
- Ensure
make testpasses before submitting
make clean build test # Verify build and tests
make docs # Ensure docs generateThis project is licensed under the MIT License. See the LICENSE file for details.
- metadata-extractor - EXIF/XMP parsing library
- Apache Commons Imaging - Additional image format support
- Adobe XMP Core - XMP metadata handling
- JUnit 5 - Testing framework
Typical performance on modern hardware (Intel i7 10th gen, 16GB RAM, SSD):
| Operation | Performance |
|---|---|
| Directory scan (1,000 files) | < 2 seconds |
| Thumbnail generation | ~50ms per image |
| Metadata extraction | ~10ms per image |
| Snapshot comparison | < 1 second |
| Search with filters (10,000 files) | < 500ms |
Performance scales linearly with file count for most operations.
Built with β€οΈ using Java 17
