NegPy

marcinz606GPL-3.0活跃维护

把胶片负片扫描件反相成正片,并模拟相纸与暗房色彩流程,适合自己扫底片的摄影玩家。

Tool for processing film negatives.

0.68.0发布于 2026-11-08 09:46 UTC1,159star +1 / 7 天118fork同步于 2026-11-10 11:50 UTC

怎么上手

由 README 提炼,执行前请确认
安装 uv 和 rustup 后运行:make install
make run
硬件要求按 README 说明

README 未给出具体显存要求,但提到可在 override.toml 中用 max_texture_size 限制 GPU 纹理尺寸以适配低显存显卡,也可设 backend = "cpu" 关闭 GPU 渲染改用 Rust 多核 CPU 路径;GPU 后端支持 Vulkan、Metal、DX12。

支持 Apple Silicon
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

把胶片负片和反转片扫描件处理成成品照片的桌面工具,模拟胶片与相纸特性

把胶片负片扫描件反相成正片,并模拟相纸与暗房色彩流程,适合自己扫底片的摄影玩家。

核心能力

  • 按各通道感光特性去除橙色色罩,无需相机配置文件
  • 在密度空间用 H&D 曲线建模相纸并按 ISO-R 分级
  • 内置 Ilford、Kodak、Foma、Fuji 相纸配置
  • 支持 C41 彩色负片、黑白与 E6 反转片模式
  • 用多边形、椭圆和片边蒙版做局部加减光

容易踩的坑

需要 Python 3.13+ 并同时安装 uv 与 rustup,否则 make install 无法完成;官方构建未签名,macOS 需先执行 xattr -cr /Applications/NegPy.app,Windows 安装时会有警告;Windows 上 Plustek 扫描仪需用 Zadig 装 WinUSB 驱动替换 SilverFast 驱动,且 Windows 不支持联机拍摄。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本0.68.0
  1. 0.68.0NegPy 0.68.0最新正式版2026-11-08 · 2026-11-08 09:46 UTC

    0.68.0

    • New: Fade Restoration — restores the dyes of faded slides on its own Roll-tab card, with an optional Remove Stain. @thetalkingdrum
    • New: B&W slides — a Slide B&W toggle for B&W reversal film (Scala, Fomapan R, dr5), or a color slide through the B&W Filter.
    • New: Pick Dmin and Dmax by hand — for difficult frames that auto metering reads wrong; Film Base moves to the Analysis Readouts header.
    • New: Roll Average stays current — new frames follow it, a crop or Metering change measures again in the background, and one Undo covers a change to several frames.
    • New: Frame No. sort for the Film Strip and the contact sheet order. @red-prs
    • New: Norwegian and Vietnamese translations. @jboneng @dinhkarate
    • New: More edge prints — Fujicolor 100, Superia Premium 400, Superpan 200, Fujifilm 400 and Lomography CN 400. @red-prs
    • New: Memory limits sized to the machine — Preferences recommends cache sizes from RAM. @jondestoppeleire
    • New: Multisampling on the Nikon LS-50 — thanks to nkscan 0.18.0 @activexray.
    • Change: Plustek — resolutions from a fixed list, pyopticfilm 1.3.9. @jboneng
    • Fix: Slides and Positive files — camera RAW slide color, Draw Region, slides out of the Roll Average, Positive JPEG ICC profiles. @thetalkingdrum
    • Fix: Auto Crop — keeps the whole picture on high-key frames and on slides. @kurtwindisch @thetalkingdrum
    • Fix: Film scanners — camera Optics and Recovery stay off scanner frames, SANE film scanners are detected by device type, and Avision color depth is set. @kurtwindisch @packetscrub
    • Fix: Lento Dock — the scan starts at the S press. @cimelab
    • Fix: Export — an 8-bit export converts color at 16 bits, and an RGB Scan triplet merges in float. @thetalkingdrum
  2. 0.67.0NegPy 0.67.02026-10-31 · 2026-10-31 07:49 UTC
    查看更新说明

    0.67.0

    • New: B&W from color negatives — print through a Yellow, Orange, Red or Green contrast filters.
    • New: Improved Roll Average — baselines always measure in the background, and a Roll Average peek (hold U) shows the frame on its roll or scene average.
    • New: Export Size view — see the frame and grain at export size; resized exports sharpen at their final resolution.
    • New: German translation @shearer.
    • New: Rolls — Save to Folder Roll, Restore Removed Frames… and Unload All…; Film Base and Half Frame work with no roll. @kurtwindisch
    • New: Scanning and merges — scan exposure warnings, Trichrome aligns to green, the three Trichrome shots join into one Film Strip frame with Edit Trichrome and Split Trichrome, better stitch seams. @seanharding @matthoosier @kurtwindisch
    • New: Kodak Ektacolor Edge print stock.
    • New: Lento Dock as a camera-scanning light — Next Frame and Whole Strip film advance, Eject, a Flat Field shot of the empty dock after the strip, and the dock's S button as Scan. @cimelab
    • New: Source Encoding for Positive TIFFs — Auto reads the ICC profile, or pick Linear or 2.2. @thetalkingdrum
    • New: Auto Masking sets Sharpening Masking from the film grain.
    • Change: Contrast Mask — refined and based on algorithm from Fuji Frontier Hypertone.
    • Change: Halation, Glow and Diffusion — more natural light spread
    • Change: Interface — more UI revinements, evenly spaced canvas backgrounds, new Roll tab card order, improved status/progress monitoring.
    • Change: Chroma Denoise — on at 2.5 by default, skipped in B&W.
    • Change: Speed — more stuff moved to Rust negpy_core, faster export and TIFF/DNG previews.
    • Fix: macOS — pinch zoom, canvas resize and a wait-cursor crash. @PabloRuizCuevas @seanharding
    • Fix: Export and metadata — TIFF Exif, Bake on Export, Subfolder of Source, EV parsing, frame numbering, and Add Custom gear opens in My Gear. @jharlap @red-prs @kurtwindisch @activexray
    • Fix: Camera scanning — a manual Canon lens grays out the aperture stepper, and a scan leaves its aperture alone. @RafatH0ssain
    • Fix: File loading — trimmed Pakon frames and camera captures of B&W film. @thetalkingdrum @seanharding
  3. 0.66.0NegPy 0.66.02026-10-24 · 2026-10-24 12:37 UTC
    查看更新说明

    0.66.0

    • New: Interface redesign — simpler panels with one shared look; fine-tune controls fold behind chevrons, and toggles replace checkboxes.
    • New: Film Strip and Light Table — the strip is one row of film under the canvas, the Light Table shows strips on a table, and the Library is the first tab on the right.
    • Change: Panel layout — Crop and Straighten cards on Geometry, one Setup card on Roll in place of the wizard and the film-process autodetect, and tabs for Export and Metadata, with Gear inside Metadata.
    • Change: User Guide and tooltips — shorter, plain-language guide panels, one-sentence tooltips and a shorter tour.
    • Change: Rust core — all CPU image work runs in a new Rust engine on every core, with the same results and faster tools; Numba and OpenCV are gone.
    • New: Translations — Simplified Chinese, Japanese and Korean. @Warth2033
    • New: Digital (Frontier) print stock; Digital (Pakon Minilab) is renamed Digital (Pakon).
    • New: Detect Scenes groups frames by light, and a scene can be dragged from any frame.
    • New: Scan tab — Meter, channel selections, infrared exposure, built-in presets and one name per capture type. @jondestoppeleire
    • New: Scanlight — a Light On toggle that holds its state, and Set by Hand with only the light connected. @seanharding @kurtwindisch
    • New: Compare with any history step or work print. @seanharding
    • New: Presets hold Optics, Flat Field and the crop shape. @kurtwindisch
    • New: Film edge print — real markings for the bundled stocks and KEYKODE for Kodak cine stocks.
    • New: Toolbar Export — an Export button on the canvas toolbar that exports the Frame, Selected or Roll choice of the Export panel; the Print menu takes the Tools button's look, and Export has one icon everywhere.
    • New: Tab header helpers — Auto beside Pick Better on Exposure, Auto Crop and Square to Film on Geometry, Optical and IR Removal on Finish.
    • New: Contact sheet — Name order by default, and a Label text field for the roll label.
    • Change: Cast Removal is a per-frame Filtration control.
    • Change: IR Removal — NegPy is the only method, improved and much faster; the OpenICE method is removed.
    • Fix: Flat export keeps the print stock's dye colors and the capture date. @thetalkingdrum @MbappeWU
    • Fix: Edits — each edit is its own undo step, Optics-pinned frames keep their flat-field profile, and Print Density Target acts only under Auto Density. @Warth2033 @MbappeWU
    • Fix: Library and thumbnails — collapsed folders are remembered, and thumbnails update on roll load. @kurtwindisch
    • Fix: macOS and export — window background, scaled-UI hairlines, and exported files take the umask's mode. @kurtwindisch @seanharding
  4. 0.65.0NegPy 0.65.02026-10-18 · 2026-10-18 15:54 UTC
    查看更新说明

    0.65.0

    • New: Print stocks — color papers and print films print their dye colors through a LUT built from Kodak's datasheets and Fujifilm's Frontier profiles; new Kodak Portra, Supra and Ultra Endura, Fujicolor Crystal Archive HD and the Vision 2383 and Vision Premier 2393 print films for color, Digital (Pakon Minilab) for a minilab's colors, Polymax II RC and Polycontrast IV RC for B&W; the control is renamed Print stock, its list grouped Digital, Paper and Print film.
    • New: Paper Test Strip — prints the frame on every print stock, as bands or a grid of whole frames; click a paper to see it on the whole frame, and Keep makes it the Print stock.
    • Change: Normalization — every channel reaches past its color refs by the same share of its own span, so Luma Range Clip no longer tints; a frame with no crop meters the picture, not the holder; saved bounds re-measure after an analysis change, and a stale roll or scene baseline asks for Reanalyze. @seanharding
    • Change: Cast Removal — foliage, sky and water stay out of the gray sets, so green and blue scenes no overcorrect into magenta, cream or pink; a frame with no neutral gets no correction.
    • New: Crosstalk — Measure from Chart fits a matrix from a ColorChecker or SpyderCheckr frame and shows each patch's ΔE00; labeled editor rows with terms to ±1; Vision3 250D and 500T re-derived from Kodak's dye curves, the Kodak consumer films re-estimated, and VERITA 200D added. An existing edit keeps its matrix until the profile is picked again.
    • Change: Narrowband toggle retired — the print stocks do its job: an old Narrowband edit opens on Digital (Pakon Minilab), and Scanning Setup picks that stock for narrowband light and Digital for white light, then suggests other stocks to try. Linear RAW is a Camera WB | Linear RAW choice.
    • Change: improved Chroma Denoise — a band split of the color channels that removes color speckle, keeps color edges and leaves grain alone; faster on CPU.
    • Change: Dropdowns — every dropdown has ‹ and › arrows that step to the neighbor choice and wrap past the ends.
    • New: Tone — Hold Black in the Auto menu lifts shadows and keeps the black point; Bake Auto Density/Grade and Bake to Roll freeze the helpers' values into a frame or the whole roll. @kurtwindisch @red-prs
    • New: Pick Better — guided tuning: pick the better of two prints round by round to set Filtration, Tone and Paper Response, in an order set with Custom Routing. @red-prs
    • New: Film Base tool — click the clear rebate to set the roll's film base; the Negative row's hover reads Dmax, Dmed and Dmin above it, and the probe's ΔD reads up from the frame's thinnest tone. @jondestoppeleire
    • New: Zone Overlay and Analysis — False Color, Zone Map and Grid looks with a toolbar legend of each zone's share, and hovering a zone shows it alone; Analysis is pinned above the Roll tab too, refreshes while a slider drags, and keeps its collapse per tab and its height across restarts.
    • New: RGB Parade — R, G and B side by side beside the Waveform, or on one plot with Parade Overlay; in Peek Negative it plots each channel's scan density with its stretch range and the film base, and Base Relative zeroes the channels on the base. @thetalkingdrum
    • New: Canvas — a Navigator for zoomed views, Frame Info levels, Probe at Cursor, double-click to toggle Fit and 100%, a Tools menu that arms any canvas tool, and hold-to keys for compare and peeks.
    • New: Library — Remove from Roll…, Move to Trash… and Show in Folder in the Film Strip, Sequence for running frame numbers that can skip rejected frames, and Load Metadata for work prints. @thetalkingdrum @kurtwindisch @red-prs
    • New: Scanning — nkscan 0.14.X cuts frames and nudges from the thumbnail as Nikon Scan does, polls for film, keeps one session per scanner and writes the scanner's color profile and resolution into the TIFF; Keep Light On holds the Scanlight lit between frames, and Captur
  5. 0.64.0NegPy 0.64.02026-10-11 · 2026-10-11 16:21 UTC
    查看更新说明

    0.64.0

    • New: Expanded Analysis — Waveform and Vectorscope views beside the Curve chart, a Clipping Overlay, zone strip hover that highlights the zone's pixels, a double-click on the zone strip toggles the Zone Overlay, and the step wedge prints through alt process and toning.
    • New: Darkroom printing — Sabattier as a third Alternative Process (Strength, Re-exposure, Agitation for the Mackie lines), Local Flash on a Dodge & Burn mask, and a Diffusion slider on the Tone card. @jondestoppeleire
    • New: Auto Grade Shadow Hold — lifts shadows on contrasty frames, and Auto Density and Auto Grade show their values on the sliders.
    • New: Camera scanning — live view histogram and clipping zebras, Meter sets the shutter from one RAW probe, single-capture narrowband scanning that saves a sensor profile, a profile captured straight from the tethered camera, a Method choice for the sensor calibration against blown blues, and a New Roll button. @jondestoppeleire @seanharding @thetalkingdrum
    • New: Check Flat Field — shows how even a flat field is from any frame, and saving warns when the reference is clipped or uneven. @thetalkingdrum
    • New: Export — a Sharpening slider that runs at the final size after a resize, and White Paper and Film Base options that print the contact sheet with less ink. @seanharding @jondestoppeleire
    • New: Workflow — Paste to every selected frame, Copy Card Settings, Undo Apply to Roll, Unmarked Only and Advance After Marking for triage, Load Edit from Sidecar…, a 1:1.4142 (ISO A) ratio, and a Color vision setting in Preferences → Accessibility.
    • New: Catalogs — every current film stock under Kodak's 2026 names, Hasselblad V, Nikonos and Nikon AF gear, five more crosstalk matrices, and Panasonic RW2 embedded lens correction. @jondestoppeleire @red-prs
    • Change: Auto Crop — a roll setting on the Crop card with Frame/Roll scope, mirrored on Geometry; Roll asks before a push changes it for other frames, hand-drawn crops stay out of it, and Square Before Crop runs the Auto Skew fit first. @kurtwindisch @jondestoppeleire
    • Change: Interface pass — a canvas toolbar with zoom, Print and Overlays menus and a tool row while a tool is armed; segmented choices, Paper Response as its own card, panels that compact instead of clipping, and tooltips on every control.
    • Fix: Export safety — an export never overwrites its source or another frame, unedited and border-crushed frames are flagged, and one failed file no longer stops a batch. @jondestoppeleire
    • Fix: Sidecars — edits restore reliably from .negpy sidecars in the Film Strip and batch export, and a fork's or composite's edit stays out of the shared sidecar.
    • Fix: Flat Field and peeks — the gain follows each frame's orientation, half frames take their own half, Auto Crop and Roll Analysis read the flat-fielded source, and an edit, frame change or rotation closes every peek. @thetalkingdrum
    • Fix: GPU and CPU match — border color, tiled paper white, warped-crop metering, Hue Trim on slides, split-toning masks, Chroma Denoise tiles and slide Shadow Reach on export; Dodge & Burn grays out on slides.
    • Fix: Scanning — Coolscan single-frame adapters, Output folder and file-pattern checks, a busy scanner on Meter Frame, typed Resolution without Enter, and film re-measured after a format change.
    • Fix: File loading — palette, MinIsWhite, CMYK, planar and two-sample gray TIFFs, LogLuv, CR3/RAF orientation, oversized TIFF and Nikon Scan thumbnails, and NegPy's own ICC profiles on reload.
    • Fix: Editing — brush and mask sizes against the whole frame, off-frame mask points kept, crop resets as undo steps, Crop Offset clamped, and forked frames and renamed roll folders keep their edits.
    • Fix: Library and canvas — brush size kept from frame to frame, a sharp canvas after a screen change, roll counts show photos, dot-prefixed files are skipped, and Cast Removal holds on a mixed neutral set.

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    CI Release Downloads License: GPL-3.0

    Platform Film Languages

    Python Rust GPU Qt uv Ruff

    Stars 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 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 supports English, Simplified Chinese (简体中文), Japanese (日本語), Korean (한국어), German (Deutsch), Vietnamese (Tiếng Việt) and Norwegian Bokmål (Norsk bokmål). The panel guides are translated into all of them except Vietnamese. 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 Auto Density and Auto Grade 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, 7600i v1 and 7600i v2 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 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 through wgpu (Vulkan, Metal or DX12), and a multi-core CPU path in Rust 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

    The recommended way is to run NegPy from source: you get each fix as soon as it is on main, and your system shows no warning for an unsigned app. CONTRIBUTING.md has the steps: install uv and rustup, then run make install and make run.

    You can also download the build for your OS from the Releases page. When a new version is out, a dot shows on the ⋯ menu, and Update to vX.Y.Z… in its Help menu installs it. 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