#!/bin/bash # scanpix # Batch scan photos of the same size # Copyright © 2016-2021 Keith Irwin www.ki9.us # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Scans a photo, alerts the user when # finished, and quits or scans another. # Useful for bulk scanning photos while # Doing other computer work. # # requires: SANE scanimage, zenity # `sudo apt-get install scanimage zenity` ## VARIABLES # Default scan area in mm Y_SIZE="99" # width X_SIZE="152" # height ## ARGUMENTS if [ $# -gt 1 ]; then echo "ERROR! Too many arguments." exit 2 elif [ $# -eq 1 ]; then FOLDER="$1" else FOLDER="$PWD" fi ## RUNTIME # Find and parse scanner name echo -n "Finding scanner... " SCANIMAGE=$(scanimage -L) SCANNER=$(echo "${SCANIMAGE:8}" | grep -oP ".*(?=')") if [ "$SCANNER" == "" ]; then echo "no scanner found!" exit 3 fi echo "found." echo "Using scanner: $SCANNER" # Ask user for a folder to scan into FOLDER=$(zenity --entry \ --title="Scan Location" \ --text="Scan photos to (no trailing slash): " \ --entry-text="$FOLDER") # User didn't enter a valid folder if [ ! -d "$FOLDER" ]; then zenity --error \ --title="Error: Scan location not found" \ --text="Couldn't find $FOLDER. Try again (no trailing slashes)" exit 1 else echo "Saving photos to $FOLDER" fi # Ask for photo size Y_SIZE=$(zenity --entry \ --title="Photo Width" \ --text="How wide are the photos (in mm)?" \ --entry-text="$Y_SIZE") X_SIZE=$(zenity --entry \ --title="Photo Height" \ --text="How high are the photos (in mm)?" \ --entry-text="$X_SIZE") echo "Scanning photos at $X_SIZE x $Y_SIZE" # Wait for first photo to be placed zenity --question \ --title="Prepare scan" \ --text="Place the first photo on the scanner and click OK" \ --ok-label="OK" \ --cancel-label="Quit" │ # Cancel if [ ! $? = 0 ]; then exit 0 fi # Repeat until user cancels while true; do # Repeat until scan succeeds or user quits while true; do # Execute scan NOW="$(date +%s)" FILENAME="$FOLDER/$NOW.jpg" echo -n "Scanning $NOW.jpg... " scanimage \ --device-name="$SCANNER" \ --mode=Color \ --resolution=1200 \ --format=tiff \ -x "$X_SIZE" -y "$Y_SIZE" \ | convert \ -rotate "180" \ tiff:- "$FILENAME" # Scan failed if [ $? = 1 ]; then echo "FAILED!" zenity --question \ --title="Scan Failed" \ --text="That photo didn't scan correctly! What do you want to do? " \ --ok-label="Try again" \ --cancel-label="Give up" if [ ! $? = 0 ]; then # Give up exit 1 fi # Scan succeeded else echo "Done." # Scan again? zenity --question \ --title="Scan Completed" \ --text="Photo scanned to $NOW.jpg\nNow what? " \ --ok-label="Scan another" \ --cancel-label="Quit" # No if [ ! $? = 0 ]; then exit 0 fi fi done done