Seite 1 von 1

Bitte hilfe mit einem pyinsane script

Verfasst: Mittwoch 1. Juli 2015, 08:05
von laurin
Hallo Community,
ich will ein Script erstellen, das meinen Scanner starten und das bild abspeichern kann. Dazu habe ich mir das Module pyinsane https://github.com/jflesch/pyinsane installiert. Anbei habe ich mal ein Example Script von der Webseite angefügt, jedoch erhalte ich einen Fehler beim Starten. Um mein eigenes Script zu schreiben, sollte ich diesen Code verstehen oder den Fehler beseitigen dann kann ich selber rumprobieren.

Der Beispiel Code läuft fast bis zum ende dann kommt aber immer die Gleiche Fehlermeldung (steht unter dem beispiel Code).


Code: Alles auswählen

import sys

``from PIL import Image

try:
   import src.abstract as pyinsane
except ImportError:
   import pyinsane.abstract as pyinsane


def set_scanner_opt(scanner, opt, value):
   print("Setting %s to %s" % (opt, str(value)))
   try:
       scanner.options[opt].value = value
   except (KeyError, pyinsane.SaneException) as exc:
       print("Failed to set %s to %s: %s" % (opt, str(value), str(exc)))


if __name__ == "__main__":
   steps = False

   args = sys.argv[1:]
   if len(args) <= 0 or args[0] == "-h" or args[0] == "--help":
       print("Syntax:")
       print("  %s [-s] <output file (JPG)>" % sys.argv[0])
       print("")
       print("Options:")
       print("  -s : Generate intermediate images (may generate a lot of"
             " images !)")
       sys.exit(1)

   for arg in args[:]:
       if arg == "-s":
           steps = True
           args.remove(arg)

   output_file = args[0]
   print("Output file: %s" % output_file)

   print("Looking for scanners ...")
   devices = pyinsane.get_devices()
   if (len(devices) <= 0):
       print("No scanner detected !")
       sys.exit(1)
   print("Devices detected:")
   print("- " + "\n- ".join([str(d) for d in devices]))

   print("")

   device = devices[0]
   print("Will use: %s" % str(device))

   print("")

   source = 'Auto'

   if (device.options['source'].constraint_type
           == pyinsane.SaneConstraintType.STRING_LIST):
       if 'Auto' in device.options['source'].constraint:
           source = 'Auto'
       elif 'FlatBed' in device.options['source'].constraint:
           source = 'FlatBed'
   else:
       print("Warning: Unknown constraint type on the source: %d"
             % device.options['source'].constraint_type)

   set_scanner_opt(device, 'resolution', 300)
   set_scanner_opt(device, 'source', source)
   set_scanner_opt(device, 'mode', 'Color')

   print("")

   print("Scanning ...  ")
   scan_session = device.scan(multiple=False)

   if steps and scan_session.scan.expected_size[1] < 0:
       print("Warning: requested step by step scan images, but"
             " scanner didn't report the expected number of lines"
             " in the final image --> can't do")
       print("Step by step scan images won't be recorded")
       steps = False

   if steps:
       last_line = 0
       expected_size = scan_session.scan.expected_size
       img = Image.new("RGB", expected_size, "#ff00ff")
       sp = output_file.split(".")
       steps_filename = (".".join(sp[:-1]), sp[-1])

   try:
       PROGRESSION_INDICATOR = ['|', '/', '-', '\\']
       i = -1
       while True:
           i += 1
           i %= len(PROGRESSION_INDICATOR)
           sys.stdout.write("\b%s" % PROGRESSION_INDICATOR[i])
           sys.stdout.flush()

           scan_session.scan.read()

           if steps:
               next_line = scan_session.scan.available_lines[1]
               if (next_line > last_line):
                   subimg = scan_session.scan.get_image(last_line, next_line)
                   img.paste(subimg, (0, last_line))
                   img.save("%s-%05d.%s" % (steps_filename[0], last_line,
                                        steps_filename[1]), "JPEG")
               last_line = next_line
   except EOFError:
       pass

   print("\b ")
   print("Writing output file ...")
   img = scan_session.images[0]
   img.save(output_file, "JPEG")
   print("Done")
output fehler:

Code: Alles auswählen

sudo python /home/pi/Desktop/scantest.py -s 1
Output file: 1
Looking for scanners ...
Devices detected:
- Scanner 'genesys:libusb:001:006' (Canon, LiDE 110, flatbed scanner)

Will use: Scanner 'genesys:libusb:001:006' (Canon, LiDE 110, flatbed scanner)

Setting resolution to 300
Setting source to Auto
Failed to set source to Auto: <class 'pyinsane.rawapi.SaneStatus'> : Data is       invalid (4)
Setting mode to Color

Scanning ...  
|Traceback (most recent call last):
  File "/home/pi/Desktop/scantest.py", line 107, in <module>
    steps_filename[1]), "JPEG")
  File "/usr/local/lib/python2.7/dist-packages/PIL/Image.py", line 1439, in save
    save_handler(self, fp, filename)
  File "/usr/local/lib/python2.7/dist-packages/PIL/PngImagePlugin.py", line 572, in _save
    ImageFile._save(im, _idat(fp, chunk), [("zip", (0,0)+im.size, 0, rawmode)])
  File "/usr/local/lib/python2.7/dist-packages/PIL/ImageFile.py", line 481, in _save
    e = Image._getencoder(im.mode, e, a, im.encoderconfig)
   File "/usr/local/lib/python2.7/dist-packages/PIL/Image.py", line 399, in  _getencoder
    return apply(encoder, (mode,) + args + extra)
 TypeError: an integer is required
Kann mir bitte irgendwer weiterhelfen?

Danke in voraus,
Laurin

Re: Bitte hilfe mit einem pyinsane script

Verfasst: Mittwoch 1. Juli 2015, 17:02
von Daikoku
Hallo laurin,

Du wirst Dich sicher wundern, warum Du keine Hilfestellung bekommst.
Das Problem wird sein, das Du die Personen hier im Forum etwas überforderst.
Ich glaube nicht, das irgend jemand tausende Zeilen Code für Dich durcharbeiten wird.

Ich kann Dir auch nicht groß weiterhelfen, aber was mir aufgefallen ist :

Code: Alles auswählen

sudo python /home/pi/Desktop/scantest.py -s 1
Output file: 1
Einen Output File einfach nur "1" zu benennen ist nicht gerade besonders sinnvoll.
Versuch es doch bitte einmal mit einem sinnvollen Namen, wie zum Beispiel "scann1_jpeg"

Ansonsten wird Dir wahrscheinlich nichts anders übrig bleiben, als den Code selber zu Debuggen
um festzustellen, welche Werte Deine Objekte vor der Fehlermeldung eigentlich haben und was
Dein Programm an dieser Stelle eigentlich erwartet.

Viel Glück.

Re: Bitte hilfe mit einem pyinsane script

Verfasst: Donnerstag 2. Juli 2015, 09:08
von laurin
Hallo
erstmal danke.
falls es irgentwen noch interessirt hir die Lösung:

es hat einfach nur ein decoder gefehlt um ein JPEG zu erstellen/verarbeiten. Mit

Code: Alles auswählen

apt-get install libjpeg8-dev
und einer neu installation von PIL ging das Script.

Re: Bitte hilfe mit einem pyinsane script

Verfasst: Freitag 3. Juli 2015, 15:48
von Daikoku
@laurin betrachte dieses Forum als eine mögliche Option.
Genauso wie Du frei entscheidest hier etwas zu posten,
haben alle anderen die frei Entscheidung darauf zu antworten.

Verhalte Dich immer so, wie Du es von anderen Dir gegenüber erwartest.

Ich finde es gut, das Du Deine Lösung hier geposted hast.