Skip to content

nkscan scanner backend - #697

Draft
activexray wants to merge 1 commit into
marcinz606:mainfrom
activexray:main
Draft

nkscan scanner backend#697
activexray wants to merge 1 commit into
marcinz606:mainfrom
activexray:main

Conversation

@activexray

@activexray activexray commented Jul 30, 2026

Copy link
Copy Markdown

This is my first go at adding nkscan support to NegPy. nkscan is a rust-based cross-platform driver for Coolscan scanners with support for the LS-9000 (medium format) and LS-50 (Coolscan V) scanners. There technically is LS-5000 support, but that's just based on reverse-engineering work and has not been tested (someone should simply give me a 5000 😅 ). The Coolscan 9000 should work on linux and windows and has been tested on both. USB support should work on everything.

nkscan itself is a PyO3-based extension module to the rust library with only numpy as an additional python dependency, which should help with dependency bloat.

As nkscan exposes quite a few more device-specific controls than SANE, we had to adjust some UI elements to expose them.

I don't know how this compares to coolscanpy other than expanded support to other nikon scanners. I've intentionally been careful and deliberate about the abstractions (backends/capabilities/etc) so it will be easy in the future to add additional scanner support.

This is a draft until I can test this on a scanner in ~ a day.

AI disclosure: This was all written by Claude Sonnet 5 as I'm not very familiar with Python.

@marcinz606

Copy link
Copy Markdown
Owner

thanks, I'll be checking it out tomorrow

@marcinz606

Copy link
Copy Markdown
Owner

I had quick look, I think we need to expose more things from nkscan first to make some features on LS-50 work with sane-parity (with current implementation strip preview won't work on ls-50) I make PR there

@marcinz606

Copy link
Copy Markdown
Owner

activexray/nkscan#5

@marcinz606

Copy link
Copy Markdown
Owner

With those changes and some adjustments to your NegPy branch I got the scanning to work on LS-50 in ui as intended.

@marcinz606

Copy link
Copy Markdown
Owner
20260731_10h18m32s_grim

@marcinz606

Copy link
Copy Markdown
Owner

main...feat/nkscan-strip-frames
branch with changes on top of your PR to get the LS-50 running (requires nkscan built with changes from my PR there)

@activexray

Copy link
Copy Markdown
Author

Wow great! I realized I missed a few things to get the 9000 to work as well in my testing, so I'll check out your MR and then fixup the stuff for the 9000, publish a v0.2 and come back to this

@activexray

Copy link
Copy Markdown
Author

@marcinz606 I was just given this archive of the official Nikon SDKs, which clears up so many gaps around my understanding and holes in my RE work, so forgive me for delaying this for a bit longer as I work through this. I want my code to follow the spec as close as possible so i don't break anyone's scanner 😅. Big shout out to @kosma for sending this to me.

@marcinz606

Copy link
Copy Markdown
Owner

nice, If you manage to dig up anything LS-50 related that might need testing just ping me :)

@webmogul1

Copy link
Copy Markdown

@marcinz606 I was just given this archive of the official Nikon SDKs, which clears up so many gaps around my understanding and holes in my RE work, so forgive me for delaying this for a bit longer as I work through this. I want my code to follow the spec as close as possible so i don't break anyone's scanner 😅. Big shout out to @kosma for sending this to me.

Would it work for whole roll scanning on the 5000? I believe it is up to 40 frames.

@kosma

kosma commented Aug 2, 2026

Copy link
Copy Markdown

Side note: I have a modified firmware that allows full roll scanning on an LS-40/LS-50. Requires cutting a hole in the back, though :)

https://github.com/kosma/coolscan-mods

@activexray

Copy link
Copy Markdown
Author

@marcinz606 I was just given this archive of the official Nikon SDKs, which clears up so many gaps around my understanding and holes in my RE work, so forgive me for delaying this for a bit longer as I work through this. I want my code to follow the spec as close as possible so i don't break anyone's scanner 😅. Big shout out to @kosma for sending this to me.

Would it work for whole roll scanning on the 5000? I believe it is up to 40 frames.

That's the plan!

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.

4 participants