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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von linux-user (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (egon_d)


Bewertung
2 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.