sane / scanimage: Ende-Erkennung vom Scan-Vorgang

Gast #5585372
Lesenswert?

Wenn man mit scanimage was scanned (Canon Lide 110), dann fährt der 
Schlitten das Dokument ab, die Ausgabe-Datei (*.pnm) wird laufend 
geschrieben. Wenn der Schlitten zurückfährt, ist die Datei bereits voll 
und verfügbar,
das scanimage-Kommando aber noch aktiv, es meldet sich nicht zur shell 
zurück.
Erst wenn der Schlitten wieder in Ausgangsposition ist, kann man mit der 
Shell weitermachen.

Beim zurückfahren des Schlittens könnte ich die Zeit nutzen, das Image 
bereits weiterzuverarbeiten mit einem Hintergrund-Prozess.

Wie kann man das machen?
Ich habe mal mit lsof versucht: Die Datei bleibt geöffnet bis das 
scanimage-Kommando fertig ist, obwohl die Datei einige Sekunden schon 
voll geschrieben ist.

Eine Idee wäre, alle 100ms die Datei-Länge zu überprüfen. Verändert sie 
sich nach 100ms nicht mehr, ist davon auszugehen, dass das image bereits 
voll eingelesen ist. Gut?
Gast #5585381
Lesenswert?

Ich würde vermutlich versuchen, die Stelle zu finden, an der scanimage 
beginnt, den Schlitten zurück zu fahren, und dort schon die Datei 
schließen (kleiner Patch für scanimage/sane). Sollte nicht allzu viel 
Aufwand sein für jemanden, der Programmieren kann.

Ansonsten ist die Idee, die Dateigröße zu prüfen, auch nicht schlecht. 
Noch eine Mindestgröße definieren, sonst wird dein Programm auch 
ablaufen, wenn irgendetwas schief geht und gar nichts gescannt wurde.

Viele Grüße,
Arno
Gast #5585425
Lesenswert?

ich habe hier ein bash-Implementation.
Allerdings musste ich die Syntax ändern.
Statt
1
scanimage -x 100 -y 100 > datei.pnm

muss ich hier schreiben
1
scanimg.sh datei.pnm  -x 100 -y 100
1
#!/bin/bash
2

3
function scan() {
4
scanimage $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15} >$1
5
}
6

7
scan $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15} &
8
sleep 1
9
n0=0
10
while [ 1 ]; do
11
  n=`stat -c %s $1`
12
  if [ $n -gt 0 ]; then
13
    if [ $n -eq $n0 ]; then
14
      #echo "n=$n"
15
      exit
16
    else
17
      n0=$n
18
    fi
19
  fi
20
  sleep 0.1
21
done
Gast #5585428
Lesenswert?

die Bash-Funktion braucht man eigentlich nicht unbedingt.
1
#!/bin/bash
2

3
scanimage $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15} >$1 &
4
sleep 1
5

6
n0=0
7
while [ 1 ]; do
8
  n=`stat -c %s $1`
9
  if [ $n -gt 0 ]; then
10
    if [ $n -eq $n0 ]; then
11
      exit
12
    else
13
      n0=$n
14
    fi
15
  fi
16
  sleep 0.1
17
done
Gast #5585590
Lesenswert?

linux-user schrieb:

> Wie kann man das machen?

Im PNM-Header stehen im Klartext (ASCII) der genaue
Formattyp sowie Breite und Höhe des Bildes. Du kannst
also mit den Angaben im Kopf genau ausrechnen, wieviele
Datenbytes noch folgen müssen.

Wenn alle da sind, die da sein sollen, kannst Du
weitermachen.
Beitrag #5587197 wurde von einem Moderator gelöscht.
Gast #5587345
Lesenswert?

> Nimm eine Stoppuhr und ermittle die Zeit für den Scanvorgang.

Das hängt stark von der Resolution ab, Mode (Gray, Color, ...), Größe 
der zu scannenden Fläche, ...
Dann kommt es mal vor, dass der Scanner nicht sofort startet, sondern 
sich noch justieren will.
Tja, die 100ms-Schleife halte ich für die einfachste und effektivste 
Lösung des Problems.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren