I have successfully set up and used
scanimage (with hplip) and found it to work consistently and reliably.
Some time ago I built a simple auto-scan wrapper that would acquire an image, display the scan on the screen for me to appraise, wait a few seconds for me to interrupt execution if the scan failed, once I was done, etc, then move on to the next image.
This (incredibly simple) system had one quirk:
scanimage would only emit my requested JPG or TIFF to disk at the end of the scan, after chewing CPU time for 3 or 4 seconds. This meant that I had to wait for the scan to finish before it displayed on the screen, so I'd always be staring at the previous successful scan while I waited for the current one to complete, which was always a UI/UX gotcha.
I would like to display scan data in "real time," not once the scan is complete, my scanner sends data to my computer progressively, and SANE is storing the data somewhere in memory as it receives it. How do I get at this raw image data as it is received? I also need to know how to usefully decode it for (low-resolution/scaled-down) display.