Forum: PC-Programmierung sane / scanimage: Ende-Erkennung vom Scan-Vorgang


von linux-user (Gast)


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?

von Arno (Gast)


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

von linux-user (Gast)


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

von Dr. Sommer (Gast)


Lesenswert?

linux-user schrieb:
> scan $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15

Mach doch einfach:
1
scan $*

von linux-user (Gast)


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

von Egon D. (Gast)


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.
von linux-user (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.