NegPy is a free, open source photo & video editors project written in Python and released under GPL-3.0. It has 1,089 GitHub stars, 99 forks and 59 open issues, and was last pushed 15 hours ago. On this registry it ranks #69 of 82 tracked projects in Photo & Video Editors, with 5 head-to-head comparisons available.

What is NegPy?

NegPy is a GPL-3.0, Python-based desktop application for Linux, macOS and Windows that turns scans of film negatives and slides into finished pictures by modelling film and photographic paper rather than simply inverting the image, and it is aimed at film photographers who scan their own rolls.

What it is

NegPy sits in the film-photography and film-scanning corner of the Python desktop ecosystem: it is a PyQt6 application written for Python 3.13 and above, released for Linux, macOS and Windows, with its source under GPL-3.0. The README states its motivation directly — it was written because the author wanted a tool made for film scans that does more than invert them. The interface and panel guides ship in English, Simplified Chinese, Japanese and Korean.

The concrete problem it addresses is the conversion step. Instead of treating a negative as an image to be flipped, NegPy removes the orange mask from each channel's own sensitometry, without camera profiles or border colour picking, and then builds the print in density space on an H&D curve with a toe, straight section and shoulder, graded in ISO-R points the way darkroom paper is graded. That replaces bare inversion and the guesswork around it with a densitometric model of film and paper, drawing paper profiles from Ilford, Kodak, Foma and Fuji datasheets.

Key capabilities

  • Conversion builds the print in density space on an H&D curve with toe, straight section and shoulder, graded in ISO-R points, with Auto Density and Auto Grade metering each frame to adjustable targets.
  • The library is a list of rolls — imported folders or virtual rolls — with roll-wide defaults for film mode, crop, calibration, metering, raw decode, lens and metadata, per-frame overrides, and Roll Analysis for a shared baseline across a roll or a scene.
  • Film scanners are driven directly: Plustek OpticFilm 8200i SE, 8100 V2, 8300i SE and 7600i v1 over USB, plus Nikon Coolscan, Reflecta, Pacific Image and anything SANE supports.
  • Tethered camera scanning on macOS and Linux covers narrowband RGB capture with a Scanlight and a sub-pixel Trichrome merge, with flat-field correction and sensor calibration for narrowband light.
  • Input formats include camera RAWs, TIFF, DNG, JPEG XL and scanner formats such as Pakon, Coolscan NEF, Flextight FFF and Noritsu.
  • Darkroom tools include dodge and burn through polygon, oval and card-edge masks, dust and scratch removal from the IR channel by the NegPy or OpenICE method, test strips, ring-around, step wedge, zone overlay and a spot densitometer.
  • Rendering uses Vulkan, Metal or DX12 with a CPU fallback that gives the same result, and output is ICC colour managed.

Who uses it and how

  • Owners of desktop film scanners run a Plustek OpticFilm over USB or reach Nikon Coolscan, Reflecta and Pacific Image hardware through SANE, keeping capture and conversion inside one application.
  • Camera-scanning users on macOS and Linux tether a digital camera, optionally with a Scanlight for narrowband RGB, and merge sub-pixel Trichrome captures in the same session.
  • People digitising whole rolls rely on roll-wide defaults with per-frame overrides, Roll Analysis for consistent baselines, keep/reject triage, half-frame splitting and stitching, and search by metadata or opt-in content.

Getting started

NegPy is distributed as prebuilt releases on GitHub Releases for Linux, macOS and Windows, with the README's download badge tracking those downloads, and the source is packaged for Python 3.13+ through pyproject.toml. The User Guide in docs/USER_GUIDE.md covers every panel and control, while docs/PIPELINE.md explains the mathematics behind the conversion.

How it compares

The facts name no comparable tool and no list of paid products that NegPy displaces, so it stands alone in this registry. Its author frames it as a film-scan tool rather than a general-purpose image editor, and there is nothing recorded here to contrast with it on licence, hosting or cost.

When to use it — and when not to

NegPy is a desktop application, so the operational burden is a Python 3.13+ environment or a downloaded release, plus a GPU with Vulkan, Metal or DX12 if hardware rendering is wanted, although the CPU fallback gives the same result; there is no server, database or mail stack to run. Tethered camera scanning is documented for macOS and Linux only, so Windows users are limited to scanner-based capture, and missing panel translations fall back to English. Anyone looking for a shared, browser-based service should look elsewhere.

project readme (upstream, from github) — read inline

NegPy

CI Release Downloads License: GPL-3.0 Python Ruff Platform Contributors Discord

NegPy turns scans of film negatives and slides into finished pictures. I wrote it because I wanted a tool made for film scans that does more than invert them. It models film and photographic paper, and adds the conveniences of a lab scanner. It is written in Python and runs on Linux, macOS and Windows.

NegPy main window

The User Guide covers every panel and control (the ⓘ on each panel opens it in the app). PIPELINE.md explains the math.

Languages

The desktop interface and panel guides support English, Simplified Chinese (简体中文), Japanese (日本語) and Korean (한국어). Choose a language in Preferences → Interface → Language, then restart NegPy. System Default follows your system language and uses English for unsupported languages. Missing panel translations fall back to English. See CONTRIBUTING.md to update or add a translation.

Features

Conversion

  • The orange mask is removed from each channel's own sensitometry: no camera profiles, no border color picking.
  • The print is built in density space on an H&D curve (toe, straight section, shoulder) and graded in ISO-R points like darkroom paper.
  • Auto Density and Auto Grade meter each frame to adjustable targets.
  • Paper profiles from Ilford, Kodak, Foma and Fuji datasheets.
  • Color negative, B&W and slide modes. Slides open as captured, with optional normalization for faded film and HDR merging of bracketed exposures.

Rolls

  • The library is a list of rolls: imported folders, or virtual rolls built from any frames.
  • Roll-wide defaults for film mode, crop, calibration, metering, raw decode, lens and metadata, with per-frame overrides.
  • Roll Analysis gives every frame of a roll, or of a scene within it, the same baseline.
  • Keep/reject triage, half-frame splitting, stitching, and search by metadata or (opt-in) content.

Capture

  • Film scanners: Plustek OpticFilm 8200i SE, 8100 V2, 8300i SE and 7600i v1 over USB, Nikon Coolscan, Reflecta, Pacific Image, and anything SANE supports.
  • Tethered camera scanning (macOS and Linux), including narrowband RGB captures with a Scanlight and a sub-pixel Trichrome merge (guide).
  • Flat-field correction, sensor calibration for narrowband light, and lens correction read from the file.
  • Camera RAWs, TIFF, DNG, JPEG XL and scanner formats such as Pakon, Coolscan NEF, Flextight FFF and Noritsu.

Editing

  • Dodge and burn with polygon, oval and card-edge masks, each with its own strength, feather, contrast grade and tone limit.
  • Dust, hair and scratch removal: automatic, from the IR channel (NegPy or OpenICE method), or painted, keeping the film grain.
  • Darkroom tools: test strips, ring-around, step wedge, zone overlay, spot densitometer and zone placement.
  • Contrast mask, tilt and swing, edge burn, filed carrier and print mats.
  • Lith, cyanotype and toners for B&W.
  • GPU rendering (Vulkan, Metal or DX12) with a CPU fallback that gives the same result.

Output

  • ICC color management, monitor profile detection and soft proofing.
  • Export to JPEG, TIFF, PNG, WebP and JPEG XL, with borders, presets, contact sheets and filename templates.
  • A flat 16-bit TIFF master for other editors, or a linear export that skips the pipeline.
  • Gear and capture metadata written to EXIF and XMP.

Your data

  • Non-destructive: source files are never modified.
  • Edits live in a local SQLite database keyed by file content, so files can move. Optional .negpy sidecars sit next to the scans.
  • Undo history and named work prints survive a restart.
  • Keyboard shortcuts can be remapped.

Getting started

Download the build for your OS from the Releases page. NegPy then updates itself from an Update Available notice.

To build from source, see CONTRIBUTING.md.

The builds are not signed, so expect a warning on first run.

Linux

Make the .AppImage executable with chmod +x and run it.

Optional, for SANE and camera scanning:

sudo apt install libsane        # Debian/Ubuntu
sudo pacman -S sane libgphoto2  # Arch

Nix

nix run github:marcinz606/NegPy

Or add it as a flake input:

{
  inputs.negpy.url = "github:marcinz606/NegPy";
  outputs = { self, nixpkgs, negpy, ... }: {
    # negpy.packages.<system>.default
  };
}

macOS

  1. Open the .dmg and drag NegPy to /Applications.
  2. Run xattr -cr /Applications/NegPy.app in Terminal.
  3. Launch it.

Optional, for SANE and camera scanning (Homebrew):

brew install sane-backends libgphoto2

To build the DMG, set NEGPY_MACOS_ARCH=x86_64 (Intel) or NEGPY_MACOS_ARCH=arm64 (Apple Silicon).

Windows

Run the installer past the warnings.

Plustek OpticFilm scanners need the WinUSB driver, installed with Zadig in place of the SilverFast driver. See PLUSTEK_WINDOWS.md. Camera scanning is not available on Windows.

Data location

Everything is in Documents/NegPy. On Windows, if that folder is blocked, NegPy asks for another and suggests Local AppData. NEGPY_USER_DIR overrides both.

  • edits.db: your edits.
  • settings.db: app settings.
  • cache/: thumbnails. Safe to delete.
  • export/: default export folder.
  • icc/: paper and printer profiles.
  • override.toml: startup overrides (below).

Troubleshooting

If NegPy crashes on startup or renders wrong, edit override.toml (written on first run). Most [performance] values are also in Preferences (Ctrl + ,), but the file wins.

[rendering]
# Options: "auto", "vulkan" (Linux/Win), "dx12" (Win), "metal" (macOS), "cpu"
backend = "vulkan"

[display]
# Qt scene-graph backend. Options: "auto", "vulkan", "d3d12", "metal", "opengl", "software"
qt_rhi_backend = "auto"

# Window system plugin (Linux only). Options: "auto", "xcb", "wayland"
qt_platform = "auto"

[performance]
# Cap GPU texture size in pixels — useful on low-VRAM cards. "auto" = no limit.
max_texture_size = "auto"

# Force HQ preview on/off. Uncomment to override saved preference.
# force_hq_preview = false

# Long edge of the interactive preview in pixels (512-8192). Higher is a sharper
# canvas and more VRAM per frame.
# preview_render_size = 1600

# Preview cache size — keeps recently-viewed photos in memory for instant navigation.
# Lower these on low-RAM machines. Uncomment to override defaults (~1.2 GB / 8 photos).
# preview_cache_max_bytes = 1200000000
# preview_cache_max_entries = 8

[logging]
# "debug", "info", "warning", "error"
level = "info"

backend = "cpu" turns GPU rendering off if the GPU backend crashes.

More

License

GPL-3.

Support

If you like NegPy, buy me a roll of film so I have more test data :)

ko-fi

Frequently asked questions

Is NegPy free to use?

NegPy is open source under the GPL-3.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does NegPy do?

Tool for processing film negatives.

What is NegPy written in?

NegPy is primarily written in Python. Its source is publicly available at https://github.com/marcinz606/NegPy, and it has 1,089 GitHub stars.