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?
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
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
|
linux-user schrieb: > scan $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15 Mach doch einfach:
1 | scan $* |
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
|
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.