Skip to content

feat(plustek): add Multi-Pass ME scanning - #1041

Closed
TobbyTravel wants to merge 1 commit into
marcinz606:mainfrom
TobbyTravel:feat/scanner-me-n-brackets
Closed

feat(plustek): add Multi-Pass ME scanning#1041
TobbyTravel wants to merge 1 commit into
marcinz606:mainfrom
TobbyTravel:feat/scanner-me-n-brackets

Conversation

@TobbyTravel

@TobbyTravel TobbyTravel commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Highlights

  • New: Multi-Pass mode. Merge 2-9 exposures per frame for lower shadow
    noise, at a roughly proportional cost in scan time. pyopticfilm's own
    benchmark on an 8100 V2 (5 exposures vs. today's 2, same frame): -26%
    relative chroma noise, -28% relative luma noise
    , visibly smoother in flat
    regions.
  • Clearer control. The old "Multi-exposure" checkbox — which secretly
    only ever meant one specific behavior — is now a single dropdown: Off /
    Dynamic (2 exposures) / Fixed (2 exposures) / Multi-Pass (2-9)
    . Choosing
    a mode is now an explicit decision instead of a hidden default.
  • Tidier scan setup. Frame selection, scan-window/Prescan, and Clear now
    live together as one full-width block right above the Scan button — the
    last thing you touch before scanning, grouped where you touch it. Crop
    info, when a crop is set, shows next to Frame info instead of its own row.
  • No new risk surface. Every mode is a name for a fully validated
    pipeline path — there's no raw exposure field, no way to type in an unsafe
    value. The debug-only raw exposure overrides pyopticfilm keeps for its own
    ScanLab tooling are never called from NegPy.
  • Fully backward compatible. Off stays the default; Dynamic at 2
    exposures is byte-identical to today's only multi-exposure behavior. No
    existing scan or saved setting changes.

Technical changes in NegPy

  • ScanParams/ScannerSettings gain a MultiExposureMode enum replacing
    multi_exposure: bool, plus a bracket count meaningful only in Multi-Pass.
    Old settings blobs migrate automatically (multi_exposure: true
    dynamic, falseoff).
  • plustek_backend.py translates the mode into pyopticfilm's
    scan(multi_exposure=, me_exposure_mode=, n_brackets=), and generalizes
    the previously 2-pass-only scan progress model to N passes.
  • ScanSidebar: mode combo + bracket slider replace the checkbox; the
    Framing section (frame spec, scan window, Prescan) moves to a full-width
    block above the Scan button; crop info relocates next to Frame info.

Why this is a PR draft

This depends on pyopticfilm API surface (n_brackets, me_exposure_mode
widened to str | None, Model.me_default_exposure_mode) that only exists
on pyopticfilm's feat/me-n-brackets branch (#47), not in any released
version yet. This will stay a draft until that pyopticfilm work is merged
and released
, since it can't be installed as a normal dependency or fully
verified against a real release until then.

Updates the Plustek scanner integration for pyopticfilm PR #47
(N-bracket multi-exposure, per-model exposure envelope), which is not
yet merged upstream.

- ScanParams/ScannerSettings gain a MultiExposureMode (Off / Dynamic /
  Fixed / Multi-Pass) replacing the old multi_exposure bool, plus a
  bracket count for Multi-Pass. Old settings blobs migrate
  automatically (checked -> Dynamic, unchecked -> Off).
- plustek_backend.py translates the mode into pyopticfilm's
  scan(multi_exposure=, me_exposure_mode=, n_brackets=) call and
  generalizes the previously 2-pass-only progress model to N passes.
  The raw/unclamped manual-exposure debug params on pyopticfilm's
  scan() are never called from here.
- ScanSidebar: the old "Multi-exposure" checkbox becomes a mode combo
  + bracket slider; the Framing section (frame spec, scan window,
  Prescan) moves to its own full-width block right above the Scan
  button; crop info (when set) now sits next to Frame info instead of
  its own form row.

Off remains the default; Dynamic/Fixed at n_brackets == 2 take the
exact same pyopticfilm call as before this change, so existing scans
are unaffected.
@TobbyTravel TobbyTravel changed the title Scanner: surface pyopticfilm's N-bracket multi-exposure modes Scanner: Multi-Pass exposure merging + a clearer Multi-exposure control for Plustek scans Sep 2, 2026
@TobbyTravel TobbyTravel changed the title Scanner: Multi-Pass exposure merging + a clearer Multi-exposure control for Plustek scans feat(plustek): add Multi-Pass multi-exposure scanning (2-9 exposures) Sep 2, 2026
@TobbyTravel TobbyTravel changed the title feat(plustek): add Multi-Pass multi-exposure scanning (2-9 exposures) feat(plustek): add Multi-Pass ME scanning Sep 2, 2026
@TobbyTravel

Copy link
Copy Markdown
Contributor Author

Closing in favor of #1064.

This branch was built against an earlier pyopticfilm design (N different exposures merged, like HDR bracketing) that never shipped. pyopticfilm instead shipped PR #65 with a different mechanism — repeating a single exposure n_passes times and stacking the aligned repeats for an SNR gain, orthogonal to the existing ME short+long fusion rather than an alternative to it (n_brackets isn't part of that API). #1064 reworks the UI/backend wiring for that actual API.

@TobbyTravel TobbyTravel closed this Sep 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant