NegPy 0.49–0.50: Slide film and B&W alt-processes got most of the attention, plus a big speed pass.

NegPy 0.49–0.50: Slide film and B&W alt-processes got most of the attention, plus a big speed pass.

Two releases worth of changes.

Highlights:

  • Transparencies now render as captured: Normalize is off by default, so a slide opens looking like it does in Photoshop or Darktable.
  • Merge exposures (HDR): select several captures of one slide, merge them into one frame covering the whole density range. Unmerge puts the originals back. Transparencies only, a negative's range already fits in a single capture
  • Alternative Processes panel (B&W only): Lith and Cyanotype.
  • Transport Line tool: one click traces a long transport scratch and repairs it
  • Reflecta and Pacific Image scanners now work without SANE, Windows included
  • A lot of performance improvements to preview and file loading/hashing.
  • Oval and card-edge dodge/burn masks, Sticky Zoom, composite badges on the film strip
  • Fixes: sharpening finally applies at the radius you set on export (judge it at 1:1), heal and scratch repairs no longer leave dark crescents, thumbnails show the right frame the right way up
  • UX improvements
  • and many more...

Full changelog + downloads:
https://github.com/marcinz606/NegPy/releases
Readme:
https://github.com/marcinz606/NegPy/blob/main/README.md
Issues:
https://github.com/marcinz606/NegPy/issues
Discussions:
https://github.com/marcinz606/NegPy/discussions

u/_earthmover — 8 days ago

NegPy 0.47–0.48: library folders & search, work prints, hue trim, linear output for scanner RAWs, half-frame rectangle editor, fixes...

Summary of 0.47.0 and 0.48.0, two releases that round out workflow (find/organise/save states) and widen Linear Output to cover real scanner files:

Highlights:

  • Library folders and metadata search: browse your own folder tree without loading anything, or query it directly (film:portra iso:>=400 -rejected:) across the loaded roll or a whole archive on disk
  • Work prints: save the live edit under a name from the History tab, click to make it live, right-click to export/rename/delete, survives undo and later edits
  • Hue Trim: a ±30° rotation of the print's colours around neutral, for lights that rotate hue rather than cast it, sits with the sensor unmix and crosstalk matrix in a new Calibration section
  • Linear Output now accepts real scanner files as sources: Coolscan NEF, Flextight FFF, Noritsu RAW, generic TIFF, with optional WB/flat-field/sensor-correction and IR-dust baking, all off by default
  • Half-frame rectangle editor: crop box, draggable split line and separator-thickness slider for setting up Half Frame instead of guessing
  • Third zone-placement pin adds a mid-tone target alongside the two extremes

Full changelog + downloads:
https://github.com/marcinz606/NegPy/releases
Readme:
https://github.com/marcinz606/NegPy/blob/main/README.md

User Guide:

https://github.com/marcinz606/NegPy/blob/main/docs/USER_GUIDE.md
Issues:
https://github.com/marcinz606/NegPy/issues
Discussions:
https://github.com/marcinz606/NegPy/discussions

u/_earthmover — 15 days ago

NegPy 0.46: Zone placement, Favourites panel, IR Dust removal improvements, Skin Protection, scanning setup wizard, fixes

Lot of work from contributors, some new features, many refinements/fixes.
Highlights:

  • Zone placement: click a zone-strip cell, click that spot on the photo, and Print Density (or Density + Grade) solves so it prints there — pins drag live, one undo step
  • Skin Protection: soft chroma ceiling on skin tones in the Lab panel
  • Favourites panel: your own tab of most-used sliders, in your own order
  • Linear Output export: a third export intent that writes the decoded source straight out as untagged linear TIFF
  • IR dust removal is meaningfully more accurate across scanners, and RAW decoding now runs on one shared scale instead of drifting per frame. Also added openICE method (rough port to python)
  • and many more...

Full changelog + downloads:
https://github.com/marcinz606/NegPy/releases
Readme:
https://github.com/marcinz606/NegPy/blob/main/README.md
Issues:
https://github.com/marcinz606/NegPy/issues
Discussions:
https://github.com/marcinz606/NegPy/discussions

u/_earthmover — 19 days ago

NegPy 0.45.0 - more color controls, darkroom proofing tools, info/helop buttons + many fixes & improvements

Short screen recording editing one negative scan:
https://www.youtube.com/watch?v=XKAnvbg2-lE

Summary of 0.44.0 and 0.45.0

Highlights:

  • Test strip: prints the frame as a 5×5 grid stepping Print Density one way and grade the other, exactly like a split-filter test strip — click a patch to keep it
  • Colour ring-around: same idea for filtration — a 5×5 mosaic stepping magenta/yellow to show which direction a colour cast actually needs correcting, instead of guessing
  • Dye Separation + Separation Damping: replaces Dye Mute and Lab Vibrance with one density-space control that pushes the print's dye densities apart (or toward neutral), with damping so a hard push fills in muted colour instead of blowing out what's already saturated
  • Step wedge: a 21-step wedge under the Analysis curve chart showing exactly where the paper's scale runs out — where the toe crushes to black and the shoulder blocks to white
  • Zone system overlay: Adams zones over the preview, sharing the same ruler as the zone strip and spot densitometer so all three agree
  • Panel guides on every panel: click the ⓘ on any section header to open that piece of the user guide right inside the app
  • Grain focuser: a loupe that follows the cursor at 2×, with an acutance figure for comparing sharpness across the frame
  • Auto crop got dramatically more reliable — detection on the reference roll went from 4/72 to 71/72 frames
  • Heads up: DNG is dropped as an export format (still fine as input/scanner output) — saved settings pointing at it now export as 16-bit TIFF
  • and many more (filed-carrier flare/corners, IR read from 64-bit HDRi DNGs, contact-sheet memory fix, camera scanning surviving a broken live view, plenty more fixes)...

Full changelog + downloads:
https://github.com/marcinz606/NegPy/releases
Readme:
https://github.com/marcinz606/NegPy/blob/main/README.md

Detailed user guide:

https://github.com/marcinz606/NegPy/blob/main/docs/USER_GUIDE.md

Issues:
https://github.com/marcinz606/NegPy/issues
Discussions:
https://github.com/marcinz606/NegPy/discussions

u/_earthmover — 22 days ago

zone system overlay in NegPy

just small feature for nerds that I just added yesterday. It automatically updates as you dial in exposure settings

u/_earthmover — 25 days ago

NegPy 0.39–0.43: Half Frame mode, auto-exposure targets, scan stitching, rebuilt sharpening, per-setting copy/paste, sensor calibration, more reliable cast removal, fixes...

Summary of releases over last week(!) (0.39.0 → 0.43.1), a lot of ground covered and many great community contributions.

Highlights:

  • Half Frame mode: proper support for scans from half-frame cameras (Pentax 17, Olympus Pen…), each scan splits automatically into two frames, each with its own edits, exposure metering and sidecar (and you can then merge them back into diptych!)
  • Stitch multi-shot scans: align, exposure-match and blend overlapping shots of one frame (e.g. a 6×6 scanned in two halves) into a single composite that develops and exports like any other frame; Unstitch reverses it
  • Sharpening rebuilt: new Radius and Masking controls, plus a Deconvolution (Richardson-Lucy) mode alongside the classic Unsharp Mask
  • Copy/paste and Apply-to-roll are now per-setting: pick exactly which settings to copy or apply from a picker instead of broad section checkboxes
  • Sensor Calibration: a 3×3 unmix profile corrects the channel bleed narrowband LED scans pick up through the sensor's colour filters
  • More reliable cast removal and colour-bounds estimation, recovers strong casts it used to reject outright
  • Custom Auto Density / Auto Grade targets: calibrate the autos to your own scanner and taste instead of fixed defaults
  • Nikon Coolscan support (foundation work), early SANE-based backend for Coolscan users. Multiplatform non-SANE drivers incoming...
  • and many more (presets UX pass, contact sheet labels, a Manage Database dialog, IR dust removal rebuilt, faster/clearer camera scanning, plus a long list of fixes)...
  • Also intel macOS version is back!

Full changelog + downloads:
https://github.com/marcinz606/NegPy/releases

User guide:

https://github.com/marcinz606/NegPy/blob/main/docs/USER_GUIDE.md

Readme:
https://github.com/marcinz606/NegPy/blob/main/README.md

Issues:
https://github.com/marcinz606/NegPy/issues

Discussions:
https://github.com/marcinz606/NegPy/discussions

u/_earthmover — 26 days ago

NegPy 0.38: expanded finish panel; Keep/Reject triage; roll-aware batch autocrop, smarter dust cleaning, fixes...

Record number of contributors resulted in big changelog, some new features, many refinements/fixes.

Highlights:

  • Finish panel: print finishing after crop — Edge Burn (radial or rectangular card-burn) replacing boring digital vignette, Filed Carrier (black rebate of a filed-out negative carrier), and more adjustments to Border/mat.
  • Keep / Reject triage on the contact sheet: cull a roll as you review it, filter the sheet to keepers or hide rejects, marks persist across sessions
  • Roll-aware Batch Autocrop: analyzes every visible frame together before Batch Analysis for more consistent camera-scan crops, runs in the background
  • Tweaked infrared dust cleaning: better detection, a new IR Restore tier, and an Overlay view to see exactly what's being caught
  • and many more...

Full changelog + downloads:
https://github.com/marcinz606/NegPy/releases

Readme:

https://github.com/marcinz606/NegPy/blob/main/README.md

Issues:

https://github.com/marcinz606/NegPy/issues

Discussions:

https://github.com/marcinz606/NegPy/discussions

u/_earthmover — 1 month ago
▲ 51 r/FOSSPhotography+1 crossposts

NegPy 0.37.0

0.37.0

Once again, many contributors, many new features, refinements, fixes

Highlights:

  • Crosstalk matrix editor — browse the bundled matrices, make an editable copy, tune channel-mixing terms with live preview, save your own .toml profiles
  • Editable Dodge & Burn masks — reshape any mask right on the canvas instead of redrawing from scratch
  • Straighten tool — draw a reference line and the frame rotates to match, composes with Fine Rotation and the crop handles
  • Three new B&W toners: Iron Blue, Copper, Vanadium Green
  • One Analysis chart — histogram and H&D curve merged into a single graph, showing live where the negative's densities land on the paper curve with added zone strip & spot densitometer
  • Improved keyboard shortcut editor - with search and collapsible sections
  • A pile of camera-scanning reliability work
  • A lot of smaller UX improvements & bug fixes...

Full changelog + downloads:
https://github.com/marcinz606/NegPy/releases

Readme:

https://github.com/marcinz606/NegPy/blob/main/README.md

Issues:

https://github.com/marcinz606/NegPy/issues

Discussions:

https://github.com/marcinz606/NegPy/discussions

reddit.com
u/_earthmover — 1 month ago
▲ 352 r/FOSSPhotography+1 crossposts

NegPy 0.36: Per-channel H&D curve controls, split-grade, camera scanning with scanlight™ support, UI refinements, fixes...

This is community project at this point, big part of improvement & features outside main exposure/color science came from contributors - magic of open source!

Highlights:

  • Camera Scanning: new tab for scanning with a tethered camera, with narrowband RGB sync or a normal single-exposure mode, and live focus/ISO/shutter controls (macOS/Linux only, tested with Sony bodies but should work on all libgphoto2-supported cameras)
  • Split Grade and per-layer trims: shadow/highlight contrast control and per-channel curve correction
  • Crop composition guides — Thirds, Phi Grid, Diagonals, Golden Spiral and more
  • and many more...

Full changelog + downloads:
https://github.com/marcinz606/NegPy/releases

Readme:

https://github.com/marcinz606/NegPy/blob/main/README.md

Issues:

https://github.com/marcinz606/NegPy/issues

Discussions:

https://github.com/marcinz606/NegPy/discussions

u/_earthmover — 1 month ago

NegPy 0.32.0: more conversion pipeline tweaks

Downloads:

https://github.com/marcinz606/NegPy/releases

Readme:

https://github.com/marcinz606/NegPy/blob/main/README.md

0.32.0

  • Change: Crosstalk moved to the Process panel — the unmix now applies to the raw negative densities before analysis and inversion, making it more physically correct. Old edits migrate automatically but expect a subtle shift on frames that used Separation. Re-run Batch Analysis after changing it.
  • Change: Process panel split into Process and Roll Analysis collapsibles.
  • New: Print stats row — exposure in stops and CMY white balance as dichroic CC filtration (±1.0 = ±20cc).
  • New: Scan clip warning — per-channel share of source pixels at sensor white (red above 1%); in a negative scan that clipping destroys base/shadow separation and can only be fixed at capture.
  • Change: halation is masked in linear light (its footprint no longer moves with Grade/Density) and, like glow, composited additively.
  • Fix: the H&D chart now matches the render at hard grades — the grade-coupled toe/shoulder was applied by the engine but not shown by the chart.
u/_earthmover — 2 months ago

NegPy 0.30.0: fully scene-linear pipeline, optimizations, tweaks, fixes

https://github.com/marcinz606/NegPy/releases

https://github.com/marcinz606/NegPy/blob/main/README.md

EDIT: quick update with much improved (green) cast handling with version 0.30.2

0.30.2

  • Cast Removal — cleaner highlights — the per-channel gray balance now anchors a third (highlight) reference, fitting a curve through highlight/midtone/shadow instead of a line. Fixes highlights occasionally overcorrecting past neutral (toward magenta) under 0.30.1.
  • More bundled crosstalk profiles — additional Lab Crosstalk matrices for common film stocks, derived from official datasheets.

0.30.1

  • Improved Cast Removal — neutral greys no longer drift slightly green. Cast Removal now balances each colour layer at the midtone as well as the shadows (a true two-point per-channel gray balance), measured only on near-neutral pixels so green-heavy scenes (foliage, skin) can't pull the balance. Previously the midtone leaned on a single luminance reading that is mostly green, leaving a faint green cast on many C-41 conversions. The default look shifts slightly toward neutral.

0.30.0

  • Scene-linear pipeline — the whole conversion now runs in scene-linear light internally: the creative stages (Retouch, Lab, Local, Toning, Finishing) operate on linear light instead of gamma-encoded data, so their math is physically correct, and the "print" colour space is now the wide-gamut ProPhoto RGB. The output/display transform is applied only at the very end with the correct working-space curve, fixing a latent mismatch where the internal buffer was sRGB-encoded but tagged as a wider space. Dust retouching keeps the same (perceptual) detection but now heals in linear light, with the CPU and GPU paths unified. In practice: more headroom before saturated colours clip, and a more accurate, slightly more saturated default look — existing edits will look a touch different, so re-tune Saturation/Toning to taste.
  • Independent roll average for luma and colour — the single Use Roll Average toggle is now two buttons, Use Luma Average and Use Colour Average. You can take the roll-wide tonal-range (black/white-point) baseline while letting each frame find its own colour balance, or vice-versa. With both on it behaves exactly like the old Use Roll Average; with both off, like per-image local.
  • Linear RAW on by default — RAW files now decode with neutral (1,1,1,1) multipliers, bypassing the camera's as-shot white balance. You can still re-enable camera WB with the Linear RAW toggle in the Exposure sidebar (off = camera WB applied).
  • Faster auto-exposure analysis — the block-median prefilter behind Auto Density/Grade and normalization is now multi-threaded with bit-for-bit identical results, roughly 2.5× faster on large frames, so opening files and batch analysis feel snappier.
  • Snappier live preview (GPU) — the GPU preview no longer re-meters the negative every frame (auto-exposure analysis is cached per image and reused while you drag creative sliders), and the engine caches bind groups, uses lighter preview decodes and a source cache. Dragging sliders is dramatically smoother and repeat exports are faster, with identical results.
  • Contact-sheet output location & templates — set an explicit output folder for the contact sheet, and save/recall named layout templates.
  • Flat output tidies the Export panel — the Flat intent hides controls that don't apply, and honours your Print/Pixels sizing.
  • Export panel reorganised — laid out in export order (output intent, settings, then the Export buttons), with presets, contact sheet and preview tucked into collapsible sections below.
  • Rule-of-thirds grid on crop, plus a denser 10×10 leveling grid while fine-rotating.
  • Edited controls turn yellow — changed sliders and the tabs holding them tint yellow, so you can see what you've touched.
  • VISION3 500T crosstalk matrix added to the bundled Lab Crosstalk profiles.
  • Fix: main window now fits small (1368×768) screens, and remembers its size/position.
  • Fix: long monitor ICC profile names no longer force a horizontal scrollbar in the Export panel.
  • Fix: Pakon .raw files no longer show a thin strip of garbage pixels along the left edge (and process a touch darker) — the loader now skips the file's small header.
u/_earthmover — 2 months ago

NegPy 0.26.0 - UI redesign + some minor fixes to ICC handling.

Rainy weekend so i finished UI redesign that I planned for later :) It's way less "busy" now.

https://github.com/marcinz606/NegPy

CHANGELOG:

0.26.0

Reworked interface — the panels have been reorganised around the editing workflow.

  • Editing tools split into workflow tabs — the single long Controls list is now four icon tabs that follow the pipeline: Setup (Presets, Geometry, Process), Exposure, Color (Lab, Toning) and Finish (Retouch, Finishing), alongside Export, Metadata and Scan. The tab bar is icon-only with hover tooltips, and each tab scrolls on its own. Jump straight to a tab with Ctrl+1Ctrl+7 (rebindable, shown in the ? overlay).
  • Analysis pinned to the top — the histogram, photometric curve and stats now sit in a sticky, collapsible Analysis section at the top of the right panel (instead of a left-panel tab), and a draggable divider lets you resize Analysis vs. the controls below it. Its size and open/closed state persist across restarts.
  • Left panel is now just the filmstrip — Export, Metadata, Scan and Analysis moved to the right panel, leaving the left side a clean contact sheet.
  • Contact-sheet thumbnails — the filmstrip is now a justified grid: thumbnails scale to fill the panel width and add/remove a column as you resize, with a subtle border hugging each image (no boxy cell). The current image is shown full-brightness with a gold frame while the rest are dimmed. Labels are dropped for a denser sheet (filename still on hover).
  • Compact filmstrip toolbar — file actions (Add files / folder, Clear, Hot Folder, Sync Edits, Sync Crop) are now a single row of icon buttons, with Sort folded into a dropdown.
  • GPU acceleration moved to the bottom toolbar — a single ⚡ toggle (with a tooltip showing on/off and the active backend) replaces the checkbox + badge in the side panel.
  • Esc cancels the active tool — deselect WB Pick / Manual Crop / Move Crop / Heal without clicking its button again.
  • Shift+A triggers Autocrop — new keyboard shortcut for the Auto crop button.
  • UI scaling — a UI Scale entry in the toolbar ⋯ menu scales the whole interface from 80% to 120% (applied on next launch).
  • Fix: a freshly selected thumbnail could briefly show a wrong (blue) colour cast until you re-selected the file — rendered thumbnails are now colour-managed to match the canvas and captured only once the render has settled.
  • Fix: preview is now colour-managed to your monitor — the preview previously assumed an sRGB display, so on a wide-gamut screen (e.g. Display P3) it looked over-saturated or washed out and shifted when you changed the Output ICC. The final preview is now converted to the monitor's ICC profile, auto-detected from the screen the window is on (and re-detected when you move it to another display). Falls back to sRGB when the OS reports no profile. (#243)
  • Display profile selector (Export → ICC): a new Display dropdown shows the auto-detected monitor profile ("As detected — …") and lets you override it with a common space (sRGB, Display P3, Adobe RGB, Rec 2020, ProPhoto). Use the override on wide-gamut monitors whose profile the OS doesn't report (common on Linux). Affects the preview only, not the export.
  • Soft proof toggle (Export → ICC, off by default): like Photoshop's Proof Colors. Off, the preview is simply your edit shown correctly on your monitor and the Output/Input ICC affect the exported file only. On, the preview simulates the Output profile. Defaulting off keeps the preview stable when you change export color space.
  • Paper/printer soft proofing: with Soft proof on, selecting a paper/printer ICC (RGB or CMYK) as Output now simulates the print on screen — paper white, reduced black, and gamut compression (absolute-colorimetric proofing). Previously paper profiles changed nothing in the preview (and CMYK profiles silently did nothing).
u/_earthmover — 2 months ago

NegPy 0.25.0: big conversion changes, custom crosstalk matrix support, ICC handling fixes, autocrop improvements

A lot of changes under the hood, I recommend resetting the edits or just deleting edits.db and settings.db in documments folder!.

https://github.com/marcinz606/NegPy

0.25.0

  • Reworked negative conversion — the default conversion now behaves much more like a real darkroom print: paper-like highlight roll-off, true deep blacks, and a paper-white base. Out-of-the-box results should look more natural and respond more predictably as you adjust Density and Grade.
  • Auto Density (new, on by default) — meters each frame individually and sets a sensible brightness, so an over- or under-exposed negative comes out usable without manual tweaking. It corrects partially, so a deliberately dark (low-key) or bright (high-key) shot keeps its mood instead of being flattened to a neutral grey.
  • Auto Grade (new, on by default) — chooses contrast to suit each scene, gently: a flat scene gets a little lift, a punchy scene stays punchy, but nothing is pushed to a harsh extreme. Together with Auto Density this aims for results that look right straight away while staying easy to fine-tune.
  • Grade now uses the ISO R scale — contrast is set on the photographic ISO R paper-grade scale (R180 very soft … R110 ≈ classic grade 2 … R50 very hard) instead of the old 0–5 number, so the curve's 10–90% span maps to a real paper exposure range. Old saved 0–5 grades migrate automatically (R = 150 − 20·G), keeping the look of existing edits.
  • With the auto helpers off, the conversion follows your negative honestly — a dense / over-exposed negative comes out dense and contrasty, a thin / flat negative comes out flat. Nothing is normalised away, so the print reflects exactly how the frame was exposed and developed. Flip the toggles off when you want the conversion to show you your photography rather than smooth it out — a useful way to read your own exposure and development.
  • Cast Removal (new, on by default) — automatically neutralizes the colour cast a negative leaves in the print. It balances each colour layer so greys read neutral all the way from the deep shadows through the highlights, not just in the midtones — the usual cause of shadows or highlights drifting off-colour after a midtone white balance (C-41).
  • Contrast Lift (new, off by default) — a gentle contrast lift about paper white based on preferred tone reproduction (Bartleson-Breneman): prints viewed in a normal room want slightly more midtone contrast than a 1:1 reproduction, so this darkens midtones a touch and adds snap.
  • Flare (new, off by default) — a darkroom-style veiling-glare floor that gently lifts the deepest blacks and softens the toe for a more film-like look, while leaving paper white fixed.
  • Autocrop rework: more robust film-edge detection, with a new Autocrop Mode selector in the Geometry sidebar — Image only crops to the exposed image area (default), Film edge crops to the full film extent, keeping the rebate/sprockets. Detection should be more reliable across stocks and border types.
  • Custom crosstalk matrices: the Lab Crosstalk control (renamed from Separation) now has a profile dropdown. Drop your own .toml calibration matrices in the NegPy/crosstalk folder (a starter set is seeded on first run) and pick them per film stock or scanner; the built-in matrix stays available as Default. See docs/CROSSTALK.md for the format and how to contribute matrices to the bundled gallery.
  • Fix: ICC color management now apply correctly on export — The on-screen preview is now color-managed through a working-space → sRGB display LUT, so what you see matches the exported file.
  • ICC moved into Export panel: a dedicated ICC section holds explicit Input and Output selectors. The Output selector lists target color spaces and custom ICC profiles (bundled profiles that duplicate a color-space entry are hidden). The Output selection drives both the preview and the exported file (WYSIWYG — no separate apply toggle): the preview shows the output space directly, matching the file as seen in a non-color-managed viewer, and the export converts to and embeds the same profile. Input ICC corrects the source. The standalone ICC section in the right Controls panel has been removed.
  • Hideable side panels: the left Session panel and right Controls panel can now be collapsed for a focused, canvas-only view. New toggle buttons sit at the outer edges of the bottom toolbar (and Ctrl+[ / Ctrl+] shortcuts) — the button reflects each panel's current state and hidden/shown state is remembered across restarts.
  • Fix: colour adjustments now use the correct working colour space — Saturation, Vibrance, Chroma Denoise and Split Toning compute their CIELAB without sRGB conversion — greens and cyans especially — shift more accurately and predictably. Neutral greys are unaffected.
  • Fix: export no longer drops metadata when the source EXIF carries an out-of-range tag.
  • Fix: Batch Analysis now respects the file browser filter — with a filter active, only the visible files are analyzed, matching Batch Export's behaviour (instead of always running on every file in the folder). (#237)
u/_earthmover — 2 months ago

NegPy 0.24.0: before/after preview; better dynamic range control & batch analysis, performance improvements, fixes

https://github.com/marcinz606/NegPy

https://github.com/marcinz606/NegPy/releases

0.24.0

  • Added Before/After: toggle button ◑ on toolbar (and \ shortcut) to flash the un-graded auto conversion of the current frame, so you can see what your edits changed at a glance.
  • Faster preview loading: opening and navigating between photos is now faster. Previews use a quick decode for display (full quality is still used on export), recently-viewed images are kept in memory, and an embedded thumbnail shows immediately while the full preview loads.
  • Process sliders: White/Black Point offsets stay editable while Roll Average is on (only Analysis Buffer and D-Range Clip are locked by roll average). Disabled sliders can no longer be scrubbed by dragging their label.
  • Selection vs. open: clicking a thumbnail now only selects it (for batch operations); double-click — or the arrow keys — opens it for editing. Importing files or a folder auto-opens the first one.
  • Batch Analysis now applies the current image's Analysis Buffer and D-Range Clip to every file in the roll before averaging — set them once on the open frame and the whole batch shares that setting (instead of each file using its own saved value). The confirmation dialog now opens every time you run it, explaining what the analysis does, how those two sliders are applied, and the crop status of the roll (so you know if any files will be analyzed on the full frame).
  • Switching photos no longer blanks the canvas — the previous frame stays on screen, dimmed under a loading spinner, until the new one is ready.
  • Fix: exporting a file whose source has a large embedded thumbnail or maker-note no longer silently drops all metadata — oversized EXIF is now trimmed to fit the JPEG limit instead of failing.

0.23.2

  • Fix: a manually cropped photo no longer fails to load with "asdict() should be called on dataclass instances" after switching to another photo and returning. The crop rectangle was reloaded as a list instead of a tuple, making the config unhashable and crashing the render cache. (#228)

0.23.1

  • Fix: adjust thresholds for film type detection to reduce negatives falsely recognized as positives.
  • Made process mode autodetect toggleable using button next to the process dropdown.

0.23.0

  • D-Range Clip now extends into negative values for outward headroom. The slider previously bottomed out at the true min/max (no clipping); pulling it below 0 pushes the normalization bounds beyond the histogram extremes, leaving lifted blacks and unclipped highlights for a gentler-than-default stretch. Positive values behave exactly as before (clipping the tails for more aggressive recovery).
  • Added Process mode autodetect: new files are now analyzed on load and the process mode (C41 / B&W / E-6) is set automatically — orange-mask detection for C41, channel-correlation for B&W, balanced channels for E-6. Detection only applies to files without saved settings, so it never overrides a mode you set yourself.
  • Fix: JPEG export now uses 4:4:4 chroma subsampling instead of libjpeg's default 4:2:0, preserving full color resolution at quality 95. Fine film grain and color detail no longer pick up chroma artifacts on export. (#224)
u/_earthmover — 2 months ago

NegPy 0.22.3: IR dust removal, improved batch analysis & edits sync, fixes

summary of some recent updates since I last posted here

https://github.com/marcinz606/NegPy

https://github.com/marcinz606/NegPy/releases

0.22.3

  • Fix: exported images now honor the source file's EXIF orientation and match the preview — rotation and crop no longer drift on export for files carrying an orientation tag. (#218)

0.22.2

  • Fix: tiled GPU export now correctly applies IR dust removal — it was silently skipped when the image was split into tiles during high-resolution export. (#216)
  • Fix: tiled GPU export no longer applies vignette independently per tile — vignette is now computed over the full frame so seams don't appear on large exports. (#217)

0.22.1

  • Fix: Batch Analysis now respects each file's crop and orientation when computing the roll-wide baseline. Previously, files with large borders (e.g. 6×6 negatives in a 3:2 scan) skewed the average because analysis ran on the full frame. (#213)
  • Sync Crop: split the Sync Edits button in two — Sync Edits (exposure / lab / toning / process settings, preserves per-file crop) and Sync Crop (manual crop + rotation only). Useful when every frame on a roll shares the same scanner mask.
  • Added Analysis Buffer overlay: while moving the Analysis Buffer slider, the canvas shows a dim border around the excluded region with a dashed accent-colored boundary, so you can see exactly what's being analyzed. Disappears shortly after the last slider movement.
  • Pre-batch warning: if none of the selected files have a crop set, Batch Analysis prompts before running and points to either cropping or raising the Analysis Buffer.
  • Status bar during Batch Analysis now indicates per-file crop state ([cropped] vs [full frame]).
  • Lowered default Analysis Buffer to 0.05 and clamped slider max to 0.25 to match the underlying clamp in analysis.

0.22.0

  • Tool-aware cursor: mouse pointer changes shape to reflect the active tool — pointing hand for WB Pick, crosshair for Manual Crop, open/closed hand for Move Crop, hidden cursor (brush circle) for Heal.
  • Added IR Dust Removal: uses the infrared channel from IR-capable scanners (Nikon Coolscan, Epson flatbeds with SilverFast iSRD, VueScan 4-channel output) to detect and inpaint dust and scratches with near-zero false positives. Toggle and threshold slider in the Retouch panel — controls are disabled automatically when no IR channel is present in the loaded file.
  • IR channel is read from: 4-channel TIFFs with ExtraSamples (VueScan, NegPy's own scanner output), multi-page TIFFs with a grayscale IR page (SilverFast iSRD), and _IR.tif sidecar files.
  • Tooltips: added detailed tooltips to every sidebar control — sliders, buttons, dropdowns, and checkboxes. Controls with keyboard shortcuts show dynamic shortcut chips that update when bindings are customised.
  • Optimizations: optimizations to preview loading speed. u/reederphill
github.com
u/_earthmover — 3 months ago

NegPy 0.21.0 - scanner support, bounds lock & copy-pasting, pinch-to-zoom, bugfixes

0.21.0

  • Added initial Scanner support on Linux and macOS: new Scan tab — select a SANE-compatible scanner, choose resolution, bit depth, output format, and filename template; scanned files auto-load into the session. This is initial implementation, tested with Plustek 8100 on Arch Linux and latest macOS. As it often is with (old in most cases of film scanners) hardware support i cannot guarantee that it will support your scanner. IMPORTANT: check README.md for information about SANE dependencies.
  • Added Lock Bounds button in the Process section — freeze normalization bounds so cropping and re-analysis don't overwrite them; useful for locking in exposure after initial analysis.
  • Added Copy/Paste Bounds between files — transfer normalization bounds from one file to another (CTRL+Shift+C -> CTRL+V).
  • Canvas zoom: pinch-to-zoom gesture support; smooth trackpad scrolling; increased min/max zoom bounds. (by reederphill)
  • Fix: TIFF export with ICC profile applied produced 8-bit tiffs.
  • Fix: Custom metadata not written correctly in tiffs.
  • Fix: Hot folder mode caused session UI debouncing lag.
  • Fix: Saturation slider above 1.0 darkened already-saturated reds/blues. Saturation now scales chroma in CIELAB, preserving perceived lightness (matches Vibrance behavior).
  • Docs: More detailed USER_GUIDE.md

https://github.com/marcinz606/NegPy

u/_earthmover — 3 months ago