# JPG Image Viewer A simple, lightweight image viewer written in C using SDL2. Supports JPG, PNG, BMP, GIF, and TIF formats with zooming, panning, and basic image navigation features. ## Features - **Multi-format support**: JPG, JPEG, PNG, BMP, GIF, TIF - **Zoom functionality**: Mouse wheel or keyboard controls - **Pan support**: Click and drag to move around zoomed images - **Auto-fit**: Automatically fits large images to window - **Responsive**: Resizable window with real-time updates - **Keyboard shortcuts**: Quick controls for common operations ## Dependencies The image viewer requires SDL2 and SDL2_image libraries. ### Ubuntu/Debian ```bash sudo apt-get update sudo apt-get install libsdl2-dev libsdl2-image-dev ``` ### Fedora/RHEL/CentOS ```bash sudo dnf install SDL2-devel SDL2_image-devel ``` ### Arch Linux ```bash sudo pacman -S sdl2 sdl2_image ``` ### macOS (with Homebrew) ```bash brew install sdl2 sdl2_image ``` ## Installation ### Arch Linux (Automated) For Arch Linux users, there's an automated installation script that handles everything: ```bash ./install_arch.sh ``` This script will: - Install SDL2 dependencies via pacman - Build the imageviewer from source - Install the binary to `/usr/local/bin` - Create a desktop entry for GUI access - Set up file associations To uninstall: ```bash ./uninstall_arch.sh ``` ### Manual Building 1. Install dependencies (see above) 2. Build the project: ```bash make ``` Or use the dependency helper: ```bash make deps-debian # For Ubuntu/Debian make deps-fedora # For Fedora/RHEL/CentOS make deps-arch # For Arch Linux make ``` ## Usage ```bash ./imageviewer ``` Example: ```bash ./imageviewer photo.jpg ./imageviewer ../misc/randomJPG/14k/bloated_image_1.jpg ``` ## Controls | Control | Action | | --------------- | ---------------------------------- | | **Mouse wheel** | Zoom in/out | | **+ / -** | Zoom in/out (keyboard) | | **Mouse drag** | Pan around the image | | **R** | Reset zoom and position to default | | **F** | Fit image to window | | **H** | Show help in console | | **ESC / Q** | Quit the application | ## Features in Detail ### Zooming - Use mouse wheel to zoom in/out at the mouse cursor position - Keyboard shortcuts: `+` to zoom in, `-` to zoom out - Zoom range: 0.1x to 10x - Smart zoom behavior focuses on mouse position ### Panning - Click and drag with left mouse button to move around zoomed images - Smooth panning for precise positioning - Works at any zoom level ### Auto-fit - Large images are automatically scaled to fit the window when first loaded - Press `F` to manually fit the current image to window - Maintains aspect ratio ### Window Management - Resizable window that adapts to content - Real-time rendering updates - Dark background for better image contrast ## Technical Details - **Language**: C (C99 standard) - **Graphics**: SDL2 for window management and rendering - **Image loading**: SDL2_image for multi-format support - **Performance**: Hardware-accelerated rendering when available - **Memory**: Efficient texture management with proper cleanup ## Makefile Targets - `make` or `make all` - Build the image viewer - `make clean` - Remove built files - `make test` - Run with a test image (if available in randomJPG folder) - `make deps-debian` - Install dependencies on Ubuntu/Debian - `make deps-fedora` - Install dependencies on Fedora/RHEL/CentOS - `make deps-arch` - Install dependencies on Arch Linux - `make help` - Show available targets and usage ## Troubleshooting ### "SDL could not initialize" Error Make sure SDL2 development libraries are installed: ```bash # Ubuntu/Debian sudo apt-get install libsdl2-dev libsdl2-image-dev # Check if libraries are found pkg-config --libs sdl2 ``` ### "Unable to load image" Error - Check that the image file exists and is readable - Verify the image format is supported (JPG, PNG, BMP, GIF, TIF) - Try with a different image file to isolate the issue ### Compilation Errors - Ensure you have a C compiler installed (gcc or clang) - Check that SDL2 headers are available - Try rebuilding with `make clean && make` ## License This project is open source. See the LICENSE file for details. ## Contributing Feel free to submit issues and enhancement requests. The code is designed to be simple and educational while being fully functional.