Guide for film scanning with the Epson V600 scanner on Linux

Published: 5/12/2025


I’ve been shooting a lot of film recently and, as part of my photography journey, I wanted to start scanning my own photos. The motivation behind the move to home-scanning is simple: the more film I shoot, the more I have spent on lab scans1 and I’d rather use that extra money on more film rolls. Another plus is that I have more control over the final photo; I’m lucky to have great labs in the Seattle area (such as Glazer’s, Moody’s, and Panda Lab), and their results have never disappointed me, but more control is something I was looking for in my process.

To achieve this goal of home-scanning, I opted to buy a used Epson Perfection V600 scanner. The opportunity was perfect, since just a few days after I started my search, my wife notified me of a marketplace listing of a film scanner. Not any film scanner, but one of the models I was looking for, at an affordable price. We ended up traveling 1 hour by bus just to get it, and it was all worth it. The sweet old lady who sold it to us told us about her project to scan old 35mm photos of her son, now in his 40s, to make him an album. After her project was done, she no longer need the scanner, and now it was up to us to give it a new home.

As the title of this post implies, my preferred OS is Linux and the distribution I use is ArchLinux, which meant that setting things up wouldn’t be as easy as it is on Windows or MacOS. What follows is the workflow I have developed over the past few weeks. I hope this post can serve for others as a starting point when setting things up in their own system.

Part 1: Downloading the drivers

The Arch wiki has a useful article detailing the different driver back-ends available to use with Epson scanners. I opted to install the Image Scan! for Linux2 back-end. The packages I installed from the Arch user repository to enable it were iscan and iscan-plugin-gt-x820. I did have issues with my system not detecting the scanner at first, but following the article’s suggestion to run udevadm control --reload did the trick. Setting up any network plugins was not required, as the scanner is connected to the computer via USB.

Part 2: Scanning individual film strips

I usually get the developed film already cut from the lab in 4 photo strips. These strips I put into the film holder tray that came with the scanner (one of the reasons why I chose this model). This means that for each 35mm film canister I end up scanning 5 photos of 2 strips each. These are the settings I found work best for me with Image Scan!:

  1. Document source: “TPU - Positive film”.
    • I use this setting even if I’m scanning negatives, because Darktable will be used to convert them.
    • Make sure to remove the white scanner cover off.
  2. Image type: “Color Photo”.
    • I always pick this both for color and black & white negatives, to make sure I provide Darktable the most information possible for each scan.
    • The monochrome module can be used later on to make sure black & white photos don’t have any color tint.
  3. Resolution: 3200 dpi.
    • Running the scanner with the previous options and a higher resolution usually results in an error that I haven’t taken the time to debug.
  4. File type: TIFF.
  5. File name: [film strip number]_strip.tiff. For example: 0_strip.tiff.
    • These are saved into ~/Pictures/scans/.

Example of my Image Scan! settings:

Suggested Image Scan! settings

Part 3: Cropping individual photos

Individual photos are cropped from the scans containing the negative strips using GIMP. The flow is as follows:

  1. Open one of the strip tiff files from ~/Pictures/scans/
  2. Use the rectangle select tool (R) and select an individual photo, leaving enough space above and below to capture the film base for later use with Darktable.
  3. Create a new image from the selection with File -> Create -> From clipboard (Ctrl + Shift + V).
  4. Export the image with the default settings to the same ~/Pictures/scans/ directory (Ctrl + E).
    • I like to number the images with the frame number as shown in the film strip. For example: 01.tiff, 02.tiff, and so on. This makes it easier to search for individual photos in my film binder if I ever need to do a re-scan.

Part 4: Importing into Darktable

To import photos into Darktable, I use the following settings and naming conventions:

  1. Import job: sticker number I got from the lab3. E.g., 1342.
  2. Base film roll’s directory: $(PICTURES_FOLDER)/Darktable.
  3. Film roll name: [start date] - [end date] - $(JOBCODE).
    • If start and end date are the same, the pattern is just [start date] - $(JOBCODE).
    • I usually keep track in my notes of dates and camera used with each film roll. For example: “Ektar 100, Nikon F100, 2025-04-02” or “Cinestill 800T, Nikon F100, 2025-04-03 -> 2025-04-11”.
    • I don’t add camera names or additional information to the film roll name since I keep track of this information using Darktable’s tagging mechanism.
  4. File naming pattern: $(SEQUENCE).$(FILE_EXTENSION).

Example:

Darktable's copy & import module

Part 5: Converting the negatives

To convert the negatives, I use Darktable’s negadoctor module. My flow is the following:

  1. Select the first photo in the film roll and open it darkroom.
  2. Convert it using the negadoctor module and don’t do any further edits.
  3. Go back to the lighttable view and copy the negadoctor module changes using the history stack module.
    • Click on the “selective copy” button:

Darktable's history stack module

  • Only include the negadoctor changes using the include checkbox for that line:

Darktable's select parts to copy

  1. Select the remaining photos and paste the copied settings using the same history stack module.

With this method, all photos have a base conversion and further adjustments can be done in a per photo basis. Here’s a before:

Darktable's lighttable view before the negative conversion and edits

And an after:

Darktable's lighttable view after the negative conversion and edits

End notes

Starting my journey with this scanner seemed overwhelming at first, but a few weeks after buying it, I’m quite used to it and cannot imagine my workflow being like it was before. I had to search for some manuals and guides along the way, and this is the final result. Integrating Darktable into this flow was natural, since it has been my preferred photo editing software for more than a year now. I’m happy that I found a scanner with good enough support for Linux, since I know lots of hardware can sometimes be hard to set up for this OS.


  1. Depending on the lab and quality of the scans, this usually costs me ~$7 for medium quality scans, which is more than enough for social media posts.
  2. Image Scan! for Linux user manual: https://download.ebz.epson.net/man/linux/iscan_e.html
  3. I’m talking about twin check labels so frequently used by the labs.