2017-06-02 8 views
0

Wie kann ich inkrementell ein Dokument unter Windows scannen, von C#, während Rückrufe erhalten, Teile des Bildes zu zeigen, wie sie kommen, und meine eigene benutzerdefinierte Fortschritt UI aktualisieren?Scannen von Dokumenten unter Windows C# mit einer inkrementellen benutzerdefinierten Fortschrittsanzeige?

Es ist wie die Scanner-API-Optionen sieht gehören:

  • WIA, WIA Script Automation (Fenster)
  • TWAIN (Windows, Linux)
  • ImageKit und ImageCaptureCore (MacOS)
  • SANE (linux)
  • ISIS (Fenster, teure Werbung).

Mein Versuch, auf WIA Script Automation:

Ich habe eine einfache C# Anwendung, die Windows-WIA Script Automation verwendet, ein Dokument zu scannen. (siehe code on github) Während des Scans wird die Benutzeroberfläche jedoch von einem Popup-Fortschrittsdialog entführt.

Der aktuelle Code scannt das WIA Scripting CommonDialog.showTransfer (see here), das einen Popup-Fortschrittsbalken-Dialog anzeigt. Ich verstehe, dass ich stattdessen Item.Transfer verwenden kann, jedoch blockiert es für die gesamte Dauer und bietet keinen Rückruf, so dass ich meine eigene benutzerdefinierte Fortschritts-UI aktualisieren kann (oder die Übertragung abbrechen).

Gibt es eine Möglichkeit, einen nicht blockierenden Scan mit WIA durchzuführen oder Fortschrittsrückrufe zu erhalten?

Muss ich TWAIN verwenden?

Antwort

1

Es sieht aus wie es gibt zwei Optionen für die nicht-blockierenden Streaming-Scan unter Windows:

WIA COM

Es ist wichtig zu beachten, dass WIA sowohl eine High-Level „Skript Automatisierung“ Schnittstelle hat und eine Low-Level-COM-Schnittstelle. Die Verwendung der Low-Level-WIA-COM bietet eine Stream-basierte Datenübertragungsmethode mit IWiaTransfer und IWiaTransferCallback.

Leider sind die C# WIA-Wrapper, die ich finden kann, die Skript-Automatisierungsschnittstelle, die keine Streaming-Scan-Schnittstelle bietet.

Twain

Seite 4-20 des Twain Specification dem Titel Buffered Memory Mode Übertragung, erklärt, wie ein Puffer fester Größe verwenden, um schrittweise die Scan-Daten zu übertragen die Befehle DAT_SETUPMEMXFER und DAT_IMAGEMEMXFER verwenden. Dies blockiert weiterhin für jeden inkrementellen Speicherpuffer, aber nach jedem Puffer ermöglicht es der Anwendung, die teilweise ankommenden Daten anzuzeigen und die Übertragung fortzusetzen oder abzubrechen.

Ich habe twain-cs und twain-dsm wie von twain.org geliefert versucht, aber sie sehen meinen Scanner nicht. Ich möchte auch vermeiden, die LGPL twaindsm.dll zu installieren.

Die twaindotnet Wrapper bietet einige Twain-Unterstützung, die funktioniert und nicht die native TwainDSM DLL benötigt.Leider unterstützt es (noch) nicht gepufferte Speicherübertragungen. Deshalb habe ich es erweitert.

Meine incremental_scanning branch of twaindotnet ist in der Lage, die Bildpixel inkrementell anzuzeigen, wenn sie ankommen, direkt in der nativen Benutzeroberfläche. Es blockiert jedoch weiterhin den UI-Thread für jeden inkrementellen Übertragungsblock. Es ist nicht klar, ob diese Blockierung in einen Hintergrund-Thread verschoben werden kann oder nicht.

youtube video of incremental scan progress

+0

Wie könnte Ihr Projekt eine inkrementelle Vorschau festlegen? Ich habe 'UseIncrementalMemoryXfer' auf 'true' gesetzt und das Ergebnis hat sich nicht geändert. – Dia

+0

Welchen Scanner benutzen Sie? Auf welches "Ergebnis" beziehen Sie sich? Ist das deine eigene App oder eine der Test-Apps? –

+0

Update: Ich verwende einen Penpower Card A8 Scanner, und ich habe Ihre WPF Test App verwendet. Ich habe 'UseIncrementalMemoryXfer' auf 'true' gesetzt. Wenn ich ein Standard-Twain-Gerät auswähle, ist das resultierende Bild immer schwarz-weiß und das Ereignis "TransferImage" wird nur einmal nach dem Scannen ausgelöst. Wenn ich den WIA-Modus meines Scanners wähle, wird das 'TransferImage'-Ereignis inkrementell ausgelöst, aber die blaue Farbe fehlt in den resultierenden Bildern. – Dia

Verwandte Themen