HDR Studio is a PyQt6 desktop app for single-image and batch HDR-style tone correction. It applies LUT-driven looks, auto-selects the best preset with face-aware heuristics, and lets you compare/export the results without leaving your local workflow.
- Live preview GUI powered by PyQt6 and OpenCV.
- Film-inspired LUT presets:
apple,fuji,kodak,neutral. - Auto preset analysis that inspects brightness, saturation, warmth, and detects faces (falls back gracefully when cascades are missing).
- Batch processor with progress, cancellation, and preset-usage summary.
- CLI helpers for automation plus tone-curve plotting scripts.
- Native macOS
.apppackaging via PyInstaller (onedir layout for fast launch).
- Python 3.10+ (3.13 tested).
- macOS or Windows with system libraries required by OpenCV/rawpy.
pip install -r requirements.txt(PyQt6, OpenCV, rawpy, etc.).
git clone https://github.com/brightleeh/hdr-studio.git
cd hdr-studio
python3 -m venv .venv
source .venv/bin/activate # or .venv\Scripts\activate on Windows
pip install --upgrade pip
pip install -r requirements.txtWith dependencies in place you can run the tools straight from the checkout—no editable install is required.
Launch the GUI without building a wheel:
python -m hdrstudio.mainRun the batch CLI (directly from the repo):
python scripts/auto_tone_batch.py --input ./examples --preset auto --quality 95Plot LUT tone curves for documentation/tuning:
python scripts/plot_tone_curve.py- Open Image: load a single image (JPEG/PNG/BMP/TIFF/RAW) and preview the corrected result.
- Auto Suggest: analyze the frame, select the recommended preset, and highlight it in compare view.
- Compare View: show all presets side-by-side; double-click to save a favored look.
- Save Preset: export the currently previewed preset override.
- Batch Folder: process a whole directory with a fixed or auto preset, resume progress bar, and stop midway if needed.
- About: version, license, and project links.
Supported formats are declared in hdrstudio/constants.py and include JPEG, PNG, BMP, TIFF, plus RAW types such as .arw, .cr2, .nef.
hdrstudio/
├─ gui/ # PyQt main window
├─ dialogs/ # Compare dialog + helpers
├─ workers/ # QThreadPool batch workers
├─ auto_tone_correct.py
├─ auto_preset.py
├─ about_dialog.py
├─ constants.py
└─ utils.py
scripts/
├─ auto_tone_batch.py
├─ build_release.py
└─ plot_tone_curve.py
Local PyInstaller builds are handled through scripts/build_release.py. The helper:
- Cleans
build/anddist/. - Runs PyInstaller in onedir mode on macOS (onefile on Windows/Linux).
- Collects OpenCV/rawpy binaries plus the
cv2/datacascades and repo resources so auto preset logic works offline. - Produces:
dist/HDR Studio.app(macOS bundle ready to run).HDR-Studio-macOS-v<version>.zipfor distribution.
Build steps:
pip install -r requirements.txt # PyInstaller included here
python scripts/build_release.pyAfter the script finishes, launch the GUI from dist/HDR Studio.app (macOS) or the generated executable in dist/ on other platforms. Codesign/notarize the .app if you plan to distribute it publicly.
Automated tests are not yet included. For manual QA:
- Launch the GUI, open a sample from
examples/, and verify the preview + compare dialog. - Toggle
Autosuggestions with face-containing and non-face images to confirm preset switching. - Run
scripts/auto_tone_batch.pyon a small folder and confirm outputs follow<stem>_<preset>.jpg. - Exercise RAW loading via a
.arw/.cr2/.neffile to verifyrawpyintegration.
MIT License — see LICENSE.txt for the full text.