2015-07-01 3 views
0

Мне нужна помощь с скриптом python. Скрипт представляет собой пример скрипта, который представляет собой модуль Pyinsane для Python. (Pyinsane https://github.com/jflesch/pyinsane) Я хочу написать собственный скрипт сканера, но для этого я должен понимать пример кода или ошибку вывода.Ошибка сценария python pyinsane

Пример сценария.

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") 

Теперь выход:

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 

Пожалуйста, Может кто-нибудь объяснить пример кода или помочь мне с ошибкой вывода?

Большое спасибо

Laurin

ответ

0

Ваша библиотека PIL/Подушка скомпилирован с поддержкой JPEG? Если нет, то попробуйте заменить:

img.save("%s-%05d.%s" % (steps_filename[0], last_line, 
            steps_filename[1]), "JPEG") 

по

img.save("%s-%05d.%s" % (steps_filename[0], last_line, 
            steps_filename[1]), "PNG") 

И

img.save(output_file, "JPEG") 

по

img.save(output_file, "PNG") 

 Смежные вопросы

  • Нет связанных вопросов^_^