Skip to content

markyip/RAWviewer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

369 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

RAWviewer v2.0.0

RAWviewer Icon

Version Downloads License Buy Me a Coffee

✈️ Why This Exists

You're an aviation photographer who just returned from RIAT or spent a day at the Mach Loop. You took thousands of RAW shots of fast jets, helicopters, and flybys β€” and now you're facing the real challenge:

  • You want to sort through all your photos and identify the best shots.
  • Tools like Lightroom or Capture One are powerful, but importing and checking each image is time-consuming.
  • The default Windows Photos viewer lets you browse, but:
    • It's clunky with RAW files.
    • You have to zoom in manually to check sharpness.
    • There's no easy way to filter out blurry images.

I've been there myself β€” I still haven't finished editing my 500GB of RIAT 2024 photos because of how tedious this process is. That frustration is exactly what inspired me to build RAWviewer.

RAWviewer is a lightweight, focused image viewer built specifically for photographers who shoot a lot β€” especially in aviation, wildlife, or sports.

  • Instant file previewing: No import steps β€” just drag & drop.
  • Zoom in with a single key to check sharpness immediately.
  • Stay in zoomed mode while browsing with arrow keys.
  • Quickly remove blurry photos from the queue with ↓ (moves them to a discard folder).
  • No complex controls to memorize β€” just the essential keys to move fast.

This is a pre-filtering tool, letting you go through hundreds of RAW files efficiently before committing to editing them in Lightroom or Photoshop.

πŸ” What is RAWviewer?

RAWviewer is a fast, modern, cross-platform image viewer for Windows and macOS, built with PyQt6. It supports advanced zooming, panning, and direct file association, allowing RAW files to be opened with a double-click.

✨ Features

  • Cross-platform support: Windows and macOS
  • Ultra-Fast Performance: Instant folder loading (scans thousands of images in milliseconds) using optimized algorithms
  • High-Fidelity Thumbnails: Uses high-quality LANCZOS resampling and 2x oversampling for crystal-clear previews on Retina and 4K displays.
  • Smart Prefetching: Predictively loads relevant images in the background for zero-latency navigation
  • Memory-First Cache (Default): Uses fast in-memory caching by default with no disk/SQLite writes
  • Optional Persistent Cache: Set RAWVIEWER_PERSISTENT_CACHE=1 to re-enable disk/SQLite cache persistence
  • Gallery View: Justified grid layout with virtualized rendering, EXIF-aware ordering, and current-image positioning
  • Gallery search (macOS + Core ML bundle): Free-text semantic ranking plus structured metadata filters (camera:, ISO, GPS, format: / ext:, and more β€” see README table below)
  • Wide RAW format support: Canon (CR2, CR3), Nikon (NEF), Sony (ARW), Adobe DNG, and many more
  • Robust Orientation Handling: Definitive fixes for Sony ARW and other RAW formats, ensuring images are always displayed upright
  • Pillarbox-Free Gallery: Accurately calculates aspect ratios to prevent black bars in the gallery view
  • macOS File Association: Fully integrated with macOS Finder; can be set as the default viewer and supports double-click to open
  • Intuitive navigation: Keyboard shortcuts, mouse controls, and scroll wheel support
  • Zoom functionality: Fit-to-window and 100% zoom modes with smooth panning, including native Mac trackpad pinch-to-zoom
  • File management: Move images to discard folder or delete permanently
  • EXIF data display: View camera settings, focal length, ISO, aperture, and capture information with robust metadata extraction
  • Session persistence: Remembers your last opened folder, image, and view mode
  • Single-image histogram: Press H to show or hide the strip while viewing one image
  • Portable executable: No Python installation required for users
  • Professional Startup: Synchronized native and Qt splash screens for a flicker-free, premium launch experience.
  • Modern UI: Material Design 3 aesthetics with Font Awesome icons (via qtawesome) and non-intrusive loading indicators
  • Platform-specific chrome: On Windows, the bottom bar omits Share (no stable system share without WinRT interop); Share remains on macOS.
  • Non-destructive visual rotate: Rotate in viewer by 90Β° steps without modifying original files (including RAW), with gallery-visible tiles refreshed immediately.
  • Precision Focus Area Detection: Overlays the camera's focus point(s) using manufacturer-specific MakerNote data (Canon, Nikon, Sony) plus EXIF SubjectArea/SubjectLocation with orientation-aware mapping and robust coordinate scaling.

πŸš€ Quick Start

Download Executable

Windows

  1. Download the latest release from the Releases Page
  2. Download RAWviewer.exe directly (no zip extraction needed)
  3. Double-click RAWviewer.exe to launch
  4. Optional: Create a desktop shortcut or pin to taskbar

macOS

  1. Download the latest release from the Releases Page
  2. Download and extract RAWviewer-v2.0.0-macOS.zip
  3. Drag RAWviewer.app to your Applications folder
  4. Double-click to launch from Applications or Launchpad
  5. First launch: Right-click β†’ "Open" if blocked by Gatekeeper

⌨️ Keyboard Shortcuts

  • Space: Toggle between fit-to-window and 100% zoom
  • G: Toggle between Gallery View and Single Image View
  • Esc: Return to Gallery View (from Single View)
  • ←/β†’ arrows: Navigate between images
  • ↓: Move current image to Discard folder
  • Delete: Delete current image (with confirmation)
  • H: Show or hide the single-image histogram strip
  • F: Toggle dashed focus/subject indicator overlay (amber = maker AF, lime = EXIF subject area)

πŸ”Ž Gallery search (Gallery view)

Open the bottom search panel. The search field placeholder is Search gallery.

  • On macOS with bundled Core ML models, free-text queries run semantic ranking over the images that pass any filters below.
  • Important: Words like face, faces, people, person, and human are not sent to the neural search: they filter by the Vision face-detection count stored at index time (same as has:face). If no faces were detected (distant subjects, backs to camera, silhouettes), those photos are excludedβ€”try free-text phrases instead, e.g. crowd, pedestrians, spectators.
  • Formats: Prefer format:jpeg Β· format:raw (type jpeg / ext raw with a space also normalize). Loose phrases file jpeg / file raw map to format: so .jpg matches JPEG synonyms and raw covers typical camera RAW extensions (not only filenames containing the substring raw).
  • You can combine a description with structured filters on one line (see examples).
  • Clear the field or use the Γ— control to restore the full folder.

Gallery search syntax examples

Separate tokens with spaces. Filters use key:value or comparison forms.

Kind Example
Free text + filter jet takeoff camera:sony iso<800
Camera / lens camera:canon Β· lens:70-200
ISO / year iso<=800 Β· year>=2024
Place city:tokyo Β· country:jp Β· admin:california
File name filename:_dsc or name:img_
File format format:cr3 Β· type:jpeg Β· ext:jpg,png Β· format:raw (same set as src/raw_file_extensions.py)
Date prefix date:2024-05
GPS / faces has:gps Β· no:gps Β· has:face Β· people Β· person Β· no:face

Optional: stronger semantic models (advanced). The app bundle uses MobileCLIP2-S0 for speed and size. From the same MobileCLIP2 family, S2 or B checkpoints usually score better on open-vocabulary retrieval at the cost of a larger Core ML package and slower indexingβ€”export with python scripts/export_mobileclip2_coreml.py --model MobileCLIP2-S2 (today’s --for-app flow names files mobileclip2_s0_*; you can replace those mlpackages after export or adjust filenames to match). You can also set environment variable RAWVIEWER_MOBILECLIP_VARIANT=s2 to prefer Apple’s downloadable MobileCLIP S2 Core ML models (a different architecture than MobileCLIP2, but often strong for general photo text queries).

Bundled macOS Core ML models are discovered automatically in common app/resource paths.
Both naming schemes are supported:

  • Apple Hub naming: mobileclip_s2_image.mlpackage + mobileclip_s2_text.mlpackage
  • App export naming (--for-app): mobileclip2_s0_image.mlpackage + mobileclip2_s0_text.mlpackage

πŸ–±οΈ Mouse Controls

  • Double-click: Zoom in to the clicked point (from fit), or zoom out to fit
  • Pinch (Mac/Windows Trackpad) or Ctrl+Scroll: Smoothly zoom in/out with smart cursor anchoring
  • Click and drag: Pan image when zoomed in
  • Drag and drop: Open images or folders
  • Scroll Wheel (fit-to-window): Navigate images - Scroll down = previous, Scroll up = next
  • Scroll Wheel (zoom mode): Pan image vertically
  • Horizontal Wheel (zoom mode): Pan image horizontally (left/right)
  • Scroll Wheel (Gallery View): Scroll through the image grid

When focus/subject indicator is enabled (F):

  • Space from fit-to-window zooms to the focus/subject box center.
  • Double-click still zooms to your clicked point (same as normal mode).

πŸ“ Supported Formats

RAW Formats

  • Canon: CR2, CR3
  • Nikon: NEF
  • Sony: ARW
  • Adobe: DNG
  • Olympus: ORF
  • Panasonic: RW2
  • Fujifilm: RAF
  • Hasselblad: 3FR
  • Pentax: PEF
  • Samsung: SRW
  • Sigma: X3F
  • And many more supported by LibRaw

Standard Formats

  • JPEG: JPG, JPEG
  • TIFF: TIF, TIFF
  • HEIF: HEIF

πŸ—οΈ Building from Source

Prerequisites

  • Python 3.8 or higher
  • pip (Python package manager)

Windows

Option 1: Using batch script (recommended)

# Run the automated build script
build_windows.bat

Option 2: Manual build

# Activate virtual environment (if using one)
rawviewer_env\Scripts\activate

# Install dependencies
pip install -r requirements.txt

# Build executable
python build.py

macOS

# Run the automated build script
./build_macos.sh

Dependencies

All dependencies are listed in requirements.txt:

  • PyQt6 >= 6.6.0
  • rawpy >= 0.25.0
  • numpy >= 2.0.0
  • Pillow >= 10.0.0
  • send2trash >= 1.8.0
  • pyinstaller >= 6.0.0
  • natsort >= 8.4.0
  • exifread >= 3.0.0
  • psutil >= 5.9.0
  • pyqtgraph >= 0.13.0
  • qtawesome >= 1.2.0

πŸ› Troubleshooting

Windows

  • "Windows protected your PC": Click "More info" β†’ "Run anyway"
  • Antivirus warnings: Add RAWviewer to your antivirus exclusions
  • Performance issues: Try running as administrator
  • AttributeError with stdout: This is normal for windowed builds - the application runs without a console window

macOS

  • "App is damaged" or "Unverified Developer": This is common for locally built apps. Our build script automatically clears the quarantine flag, but if it persists, run xattr -cr dist/RAWviewer.app in your terminal.
  • Gatekeeper warnings: Right-click the app β†’ "Open" β†’ "Open" anyway. This "registers" the app with macOS.
  • Permission Denied / Cannot Read Folder: Modern macOS requires explicit permission for apps to access the Desktop or Documents.
    1. Go to System Settings > Privacy & Security > Full Disk Access.
    2. Click the + button and add RAWviewer.app.
    3. Toggle it to ON.
  • "Open with" behavior: For the very first launch, if you see a malware warning, open the app directly via Right-click -> "Open". This "registers" the app with macOS, after which "Right-click -> Open with" will work perfectly.
  • "Semantic search unavailable" / asks to download models even in packaged app:
    1. Open RAWviewer.app/Contents/Resources/models/mobileclip2_coreml/.
    2. Confirm either S2 pair (mobileclip_s2_*) or S0 app-export pair (mobileclip2_s0_*) exists, plus bpe_simple_vocab_16e6.txt.gz.
    3. If missing, rebuild with models/mobileclip2_coreml/ present before running python build.py.

🚧 Upcoming Features

We're continuously working to improve RAWviewer. Here are some features planned for future releases:

  • Batch Operations: Select and process multiple images at once

⚠️ Known Issues

Camera Compatibility

  • Newer camera models: Support for the latest camera releases may be limited due to LibRaw library compatibility
  • Proprietary RAW formats: Some manufacturers' newest RAW formats may not be fully supported immediately after camera release
  • Firmware updates: Camera firmware updates may introduce RAW format changes that require LibRaw updates

πŸ›οΈ Architecture

RAWviewer uses a modern, optimized architecture:

  • ImageLoadManager: Manages all image loading tasks using a thread pool and priority queue
  • UnifiedImageProcessor: Handles all image types (RAW, JPEG, TIFF, etc.) with a unified interface
  • Cache System: Memory-first cache by default, with optional persistent disk cache via env flag
  • Smart Caching: Efficient image and video caching for faster navigation
  • Thread Pool: Reuses threads to avoid creation/destruction overhead
  • Event-Driven: Permanent signal connections for better performance

πŸ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

🀝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

πŸ“ž Support

If you encounter any issues:

  1. Check the troubleshooting section above
  2. Search existing GitHub issues
  3. Create a new issue with detailed information about your problem

β˜• Thank You / Buy Me a Coffee

If you find RAWviewer useful and it's become part of your workflow, feel free to buy me a coffee β˜• or chip in to help fund my RIAT tickets for next year


Enjoy viewing your RAW photos with RAWviewer! πŸ“Έ

About

A fast and modern image viewer, specially designed for photographers to quickly review images before post-processing.

Topics

Resources

License

Stars

Watchers

Forks

Sponsor this project

Contributors

Languages