Prism is a lightweight OCIO image viewer built for fast visual inspection, transform validation, and A/B comparison workflows.
It was created from a very practical need: quickly loading images, testing colorspace transforms, comparing outputs, and debugging OCIO behavior without having to launch a full compositing or grading application.
Prism focuses on still-image workflows and immediate visual feedback:
- compare two images side-by-side
- wipe between transforms
- inspect differences
- validate looks and context variables
- probe pixel values
- and quickly iterate on OCIO decisions
The goal is not to replace tools like Nuke, RV, or Resolve.
The goal is to provide a focused, lightweight environment for color pipeline inspection and experimentation, especially during look development, pipeline debugging, config validation, and day-to-day production support.
Built with:
- PySide6
- OpenColorIO
- OpenImageIO
- NumPy
Many OCIO workflows still rely on launching large DCC applications just to validate a transform, compare two outputs, or debug context-dependent behavior.
Prism was built to reduce that friction.
It provides a fast standalone environment for inspecting color behavior directly, with minimal setup and immediate visual feedback.
Whether you're:
- validating an OCIO config
- checking a display transform
- comparing renders
- debugging context variables
- verifying looks
- or simply inspecting image data
Prism aims to make that process faster and more direct.
- Load and compare two images simultaneously
- Apply independent OCIO transforms to A and B
- Compare images using Split, Wipe, Full, and Diff modes
- Inspect pixel values directly in the viewer HUD
- Adjust exposure and luminance interactively
- Edit OCIO context variables live
- Inspect LUT transfer curves in a dedicated modeless LUT window
- Inspect waveform scopes in a dedicated modeless waveform monitor
- Navigate synchronized A/B views
- Toggle transform bypass per image
- Use EXR, DPX, JPG, PNG, TIFF, and other common formats
- Built-in diagnostics window for environment validation
-
Python 3.11 through 3.14
-
Runtime packages:
PySide6OpenImageIOOpenColorIOnumpyscipy1.17 or newer, below 2.0colour-science0.4.7 or newer, below 0.5
A prebuilt Windows desktop build is available from the GitHub Releases page.
Download:
Prism-1.2.2-windows-x64.zip
Extract the zip, then run:
Prism\Prism.exe
No Python setup is required for the prebuilt Windows package.
python -m pip install prism-viewerpython -m pip install -e .For the Windows desktop build, run:
Prism\Prism.exe
For Python installs, run:
prismIf the command is not found, activate your virtual environment first and retry.
- Open image A from
File -> Open Image A... - Open image B from
File -> Open Image B... - Load an OCIO config from
File -> Open OCIO Config...
- Select Input and Output colorspaces independently for A and B
- Optionally select a Look
- Switch compare modes (
Split,Wipe,Full (A),Full (B)Diff)
- Hover over the viewer to inspect pixel values in the footer HUD
Prism also supports drag-and-drop for images and OCIO configs.
Shows A and B side-by-side.
Useful for:
- framing comparisons
- look validation
- general A/B review
Displays A/B across an interactive divider.
Use the wipe handle to inspect transitions and subtle image differences interactively.
Displays only the currently selected side (A or B).
Useful for focused single-image inspection while preserving the compare setup.
Displays grayscale absolute difference between overlapping regions.
Brighter values indicate stronger differences.
Useful for:
- transform validation
- render verification
- subtle change detection
Prism can detect and expose OCIO context variables directly from the loaded config.
Open from:
View -> OCIO Context Variables- Hotkey:
E
Behavior:
- Hidden by default
- Dynamically rebuilds from the loaded config
- Updates processing live as values change
- Can be docked or undocked
- Persists current values while visible or hidden
This is especially useful for:
- shot-based transforms
- context-driven looks
- sequence-dependent processing
- debugging OCIO environment behavior
Interactive controls allow quick image inspection without modifying source data.
Useful for:
- shadow inspection
- highlight clipping checks
- transform debugging
- general image evaluation
Open from:
View -> Background
Presets:
- Black
- Dark Gray
- Mid Gray
- Light Gray
Useful when image edges become difficult to read against the viewer background.
Open from:
View -> LUT InspectionorDrop LUT in main_window
Behavior:
- opens as a modeless utility window
- accepts drag-and-drop LUT files
- supports
.cube,.spi1d,.csp,.spi3d,.lut, and.3dlformats - plots LUT curves on an X/Y diagram that scales with window size
- for 3D LUTs, displays a neutral-axis projection (
R=G=Bsamples) - for
.cube,DOMAIN_MINandDOMAIN_MAXmust use matching RGB components (mixed per-channel domain values are treated as unsupported) - reports summary metrics including sample count, channel count, output min/max, out-of-range status, monotonicity, and CSP shaper status when available
- keeps summary analysis in core helpers and rendering in the UI layer
- uses SciPy-backed trilinear sampling for shaped CSP-style 3D LUT neutral-axis inspection, while direct lattice extraction is preserved for unshaped 3D LUT neutral axes
- does not currently display Colour/Delta E metrics; arbitrary LUT files do not provide a reliable source/target colourspace contract, so perceptual metrics are deferred until a dedicated colour-metrics workflow can state its assumptions explicitly
Open from:
View -> Monitoring -> Waveform Monitor
Behavior:
- opens as a modeless utility window
- inspects each side's float RGB analysis buffer:
- post-OCIO output when a transform is active
- loaded source data when transform setup is incomplete or bypassed
- before global exposure/luminance and channel-view presentation controls
- source modes mirror main viewer compare naming:
Full (A)Full (B)Split
- source mode is synchronized with main compare mode for supported modes:
- changing mode in waveform updates main viewer mode
- changing main viewer mode updates waveform mode
- opening waveform initializes from current main mode
- this is intentional: the waveform monitor can be used as a compact control surface for changing the active viewer comparison state
WipeandDiffare currently unsupported in waveform mode mapping:- waveform shows blank graphs with an explicit unsupported-mode message
- signal display options:
RGBRGB ParadeRGB OverlayY'with selectableBT.709orBT.2020encoded-signal weights- defaults to
BT.709 - the standard is selected explicitly and is not inferred from OCIO names
Y'is an encoded weighted signal, not scene-linear or absolute luminance
- defaults to
- applies a small SciPy Gaussian filter to rendering copies for trace readability; raw waveform density data remains unchanged
- supports drag-and-drop image loading directly from waveform:
Full (A)drops load sideAFull (B)drops load sideBSplitdrops route by pane (left -> A,right -> B)- dropped images are loaded into the main viewer, so waveform and viewer state remain synchronized
Prism includes a diagnostics window for quickly validating runtime dependencies and OCIO environment state.
Includes:
- Prism version
- Python version
- Qt / PySide version
- NumPy version
- OpenImageIO version
- OpenColorIO version
- Active OCIO config
- Platform information
Useful for:
- support,
- debugging,
- pipeline validation,
- environment troubleshooting.
- Load image A and B
- Load an OCIO config
- Configure Input and Output transforms
- Start in
Split - Move to
Wipefor edge comparison - Use
Diffto isolate subtle changes
- Load image A
- Configure transforms
- Switch to
Full - Inspect pixel values and channels
- Adjust exposure and luminance interactively
- Load image and OCIO config
- Open
View -> OCIO Context Variables - Modify context values
- Observe updates live in the viewer
-
FFit to Window -
HShow/Hide Hotkeys dialog -
EToggle OCIO Context Variables dock -
TabSwitch active side A/B -
Right/PageDownNext frame -
Left/PageUpPrevious frame -
Up/DownChange focused Input/Output item -
RToggle Red solo / RGB -
GToggle Green solo / RGB -
BToggle Blue solo / RGB -
ZRestore RGB -
1 / 2 / 3 / 4 / 5- Split
- Wipe
- Full (A)
- Full (B)
- Diff
-
Right Click + DragPan
Prism includes sample files to validate setup quickly:
- Sample images:
samples/images/ - Sample OCIO config:
samples/ocio_config/ - Sample LUTs:
sample/LUTs
Quick smoke test:
- Launch
prism - Load image A and B from
samples/images/ - Load config from
samples/ocio_config/ - Switch between
Split,Wipe,Full (A),Full (B), andDiff
Activate the intended virtual environment and reinstall from repository root:
python -m pip install -e .- Confirm
OpenColorIOis installed in the active environment - Confirm the selected file is a valid
.ocioconfig - If loading is canceled intentionally, Prism preserves current state
Prism uses OpenImageIO fallback support for formats that may not be available through Qt directly.
Verify:
OpenImageIOis installed- the active environment can import it successfully
Movie playback depends on optional backend availability such as:
opencv-pythonimageio[ffmpeg]
Still-image workflows remain fully functional without them.
- Movie workflows remain backend/environment dependent
- Some EXR/DPX workflows rely on OpenImageIO fallback support
- Windows taskbar icon refresh may lag behind icon updates until Explorer refreshes shell cache
- Vectorscope
- Chromaticity Diagram and gamut visualization
- Transform breakdown visualization
- Nuke integration
- Resolve integration
- More Display/View support
See docs/README.md for subsystem and architecture documentation:





















