Freigeben über


Schnittstellen für Segmentierungsfilter

Ab Windows Vista unterstützt WIA Segmentierungsfilter. Ein Segmentierungsfilter muss die IWiaSegmentationFilter-Schnittstelle implementieren.

Die IWiaSegmentationFilter-Schnittstelle ist abhängig von der neuen (für Windows Vista) Schnittstelle IWiaItem2, die in diesem Abschnitt verwendet wird, ist eine Obermenge von IWiaItem. Zusätzlich zu den IWiaItem-Methoden enthält die IWiaItem2-Schnittstelle die Methode IWiaItem2::GetExtension, die von einer Anwendung zum Erstellen von WIA-Erweiterungen verwendet wird, einschließlich des Segmentierungsfilters. Die IWiaItem- und IWiaItem2-Schnittstellen werden in der Microsoft Windows SDK-Dokumentation beschrieben.

Die IWiaSegmentationFilter-Schnittstelle implementiert eine einzelne Methode, DetectRegions. Diese Methode verfügt über drei Parameter: lFlags, pInputStream und pWiaItem2.

Der lFlags-Parameter wird derzeit nicht verwendet.

Der pInputStream-Parameter ist ein Zeiger auf das Bild, für das die Segmentierung ausgeführt werden soll. In der Regel handelt es sich um ein Vorschaubild, das die gesamte Scanoberfläche des Flachbetts darstellt. Der Stream wird von der Anwendung in ihrer IWiaTransferCallback::GetNextStream-Methode erstellt. Diese Methode wird während der Bildaufnahme aufgerufen. Der Treiber schreibt die erfassten Bilddaten in den Stream, den die IWiaTransferCallback::GetNextStream-Methode zurückgibt. Dies ist auch der Stream, der von der Anwendung in den Segmentierungsfilter übergeben werden sollte. Die IWiaTransferCallback-Schnittstelle wird in der Windows SDK-Dokumentation beschrieben.

Der Parameter pWiaItem2 ist ein Zeiger auf das WIA-Element, für das pInputStream abgerufen wurde. Es wird auch als übergeordnetes Element bezeichnet. Das Element, auf das pWiaItem2 verweist, kann z. B. das Flatbed-Element sein.

Die IWiaSegmentationFilter::D etectRegions-Methode wird verwendet, um die Teilbereiche des Bilds zu bestimmen, das von pInputStream dargestellt wird. Für jede erkannte Unterregion erstellt IWiaSegmentationFilter::D etectRegions ein neues untergeordnetes WIA-Element unter dem Element, auf das pWiaItem2 verweist. Für jedes untergeordnete Element muss der Segmentierungsfilter die Werte für die folgenden WIA-Eigenschaften festlegen: WIA_IPS_XPOS, WIA_IPS_YPOS, WIA_IPS_XEXTENT und WIA_IPS_YEXTENT. Diese Eigenschaften stellen das umgebende Rechteck des zu scannenden Bereichs dar. Ein erweiterter Segmentierungsfilter kann auch andere WIA-Eigenschaften festlegen, z. B . WIA-Eigenschaften für Segmentierungsfilter , wenn der Treiber das Entkewing unterstützt.

Das folgende Diagramm zeigt, wie der Segmentierungsfilter die Anwendungselementstruktur ändert. In diesem Diagramm hat der Segmentierungsfilter drei Bilder auf dem Flachbett erkannt und für jedes Bild ein neues untergeordnetes Element unter dem Flachbettelement erstellt.

Diagramm, das veranschaulicht, wie der Segmentierungsfilter die Anwendungselementstruktur ändert.

Ein Segmentierungsfilter muss alle Bildformate unterstützen, die vom erweiterten Treiber unterstützt werden. Der von Microsoft bereitgestellte Segmentierungsfilter unterstützt die Formate BMP, GIF, JPEG, PNG und TIFF. Daher ist jeder Treiber, der diesen Filter verwendet, auf diese Formate beschränkt.

Um die untergeordneten Elemente zu erstellen, ruft der Segmentierungsfilter die IWiaItem2::CreateChildItem-Methode auf. Im Folgenden finden Sie ein Beispiel für einen solchen Aufruf:

lItemFlags = WiaItemTypeGenerated | WiaItemTypeTransfer | WiaItemTypeImage | WiaItemTypeFile |
 WiaItemTypeProgrammableDataSource;

lCreationFlags = COPY_PARENT_PROPERTY_VALUES;

pWiaItem2->CreateChildItem(lItemFlags,
                           lCreationFlags,
                           bstrItemName,
                           &pChildItem);

IWiaItem2::CreateChildItem unterscheidet sich geringfügig von IWiaItem::CreateChildItem. Die IWiaItem2::CreateChildItem-Methode verfügt über den neuen Parameter lCreationFlags; Der lItemFlags-Parameter der IWiaItem2::CreateChildItem-Methode entspricht dem lFlags-Parameter von IWiaItem::CreateChildItem. Das Übergeben COPY_PARENT_PROPERTY_VALUES mit dem Parameter lCreationFlags an den WIA-Dienst, wie im vorherigen Codeausschnitt gezeigt, weist den WIA-Dienst an, alle lesbaren/schreibbaren WIA-Eigenschaften des untergeordneten Elements auf die gleichen Werte wie die des übergeordneten Elements festzulegen. Der Grund, warum ein Segmentierungsfilter dieses Flag übergeben sollte, besteht darin, sicherzustellen, dass Eigenschaften wie Bildformat und Auflösung im neu erstellten untergeordneten Element das übergeordnete Element sind. Es ist wichtig, dass die Auflösung identisch ist, da die Umfangseigenschaften, die der Segmentierungsfilter im untergeordneten Element festlegen wird, von der Auflösung des Bilds abhängig sind. Es ist auch wichtig, dass das Bildformat und die Auflösung im untergeordneten Element identisch sind, wenn eine Anwendung die Vorschaukomponente verwenden möchte (siehe Microsoft Windows SDK Dokumentation). Vor dem Abrufen des endgültigen Bilds kann eine Anwendung die Auflösung ändern, um ein Bild mit höherer Qualität vom Scanner zu erhalten.

Es ist wichtig zu beachten, dass der Segmentierungsfilter an dieselben Einschränkungen gebunden ist wie eine Anwendung, was sie tun kann und was nicht. Dies bedeutet, dass eine Anwendung die untergeordneten Elemente ändern kann, die vom Segmentierungsfilter erstellt werden. Beispielsweise ist ein Benutzer möglicherweise nicht mit dem Bereich zufrieden, den der Segmentierungsfilter erkannt hat, und weist die Anwendung möglicherweise an, diesen Bereich durch Ziehen der Ecken zu ändern. Die Anwendung kann auch untergeordnete Elemente löschen, die vom Segmentierungsfilter erstellt wurden, sowie neue elemente hinzufügen.

Beachten Sie, dass der Segmentierungsfilter nicht für das "Bereinigen" der untergeordneten Elemente verantwortlich ist, die er erstellt hat. Wenn die Anwendung also IWiaSegmentationFilter::D etectRegions mehrmals aufruft , muss die Anwendung zuerst die untergeordneten Elemente löschen, die beim ersten Aufruf der IWiaSegmentationFilter::D etectRegions-Methode erstellt wurden. Der Segmentierungsfilter ist auch nicht für das Zurücksetzen des pInputStream-Parameters verantwortlich. Die Anwendung muss sicherstellen, dass sie den Suchzeiger auf den Anfang des Datenstroms festgelegt hat, bevor der Segmentierungsfilter aufgerufen wird.

Der Segmentierungsfilter sollte nur auf dem Filmelement und auf dem Flachbettelement verwendet werden. Beim Scannen von Filmen verfügt ein Scanner häufig über feste Rahmen, in diesem Fall erstellt der Treiber die untergeordneten Elemente (weitere Informationen finden Sie unter WIA Scanner Item Tree Layout ). In diesem Fall sollte eine Anwendung den Segmentierungsfilter nicht für die Regionserkennung und erstellung untergeordneter Elemente aufrufen.

Wenn ein Treiber einen Segmentierungsfilter enthält, sollte er die WIA_IPS_SEGMENTATION-Eigenschaft für seine FLATbed- und Film-WIA-Elemente implementieren. Diese schreibgeschützte Eigenschaft verfügt über zwei gültige Werte: WIA_USE_SEGMENTATION_FILTER und WIA_DONT_USE_SEGMENTATION_FILTER, die der Treiber festlegt. Diese Eigenschaft informiert eine Anwendung darüber, ob der Segmentierungsfilter des Treibers für die Regionserkennung für ein bestimmtes Element verwendet werden soll.

Wenn ein Scanner feste Frames für das Scannen von Filmen verwendet, würde er diese Eigenschaft auf WIA_DONT_USE_SEGMENTATION_FILTER im Filmelement festlegen. In diesem Fall sollte die Anwendung nicht versuchen, den Segmentierungsfilter zu laden, nachdem die Filmvorschau abgerufen wurde. stattdessen sollten die vom Treiber erstellten untergeordneten Elemente aufgelistet werden. Diese untergeordneten Elemente stellen die festen Frames dar.

Da ein WIA-Element an IWiaSegmentationFilter::D etectRegions übergeben wird, ist es möglich, dass der Segmentierungsfilter je nach Kategorie des Elements, also Flachbett oder Film, verschiedene Algorithmen verwendet. Die Kategorie eines Elements wird in der eigenschaft WIA_IPA_ITEM_CATEGORY gespeichert.

Wenn eine Anwendung Eigenschaften in pWiaItem2 zwischen dem Abrufen des Bilds in pInputStream und dem Aufruf der Anwendung von IWiaSegmentationFilter::D etectRegions ändert, müssen die ursprünglichen Eigenschafteneinstellungen (d. h. die Eigenschafteneinstellungen des Elements beim Abrufen des Datenstroms) wiederhergestellt werden. Dies kann mithilfe der Methoden IWiaPropertyStorage::GetPropertyStream und IWiaPropertyStorage::SetPropertyStream erfolgen. Der Grund, warum diese Änderungen wiederhergestellt werden müssen, ist, dass im WIA-Element möglicherweise Informationen vorhanden sind, die für den Segmentierungsfilter erforderlich sind, die aber nicht im Bildheader gespeichert sind. Beispiele für solche Informationen sind die Daten, die in den Eigenschaften WIA_IPS_XPOS, WIA_IPS_YPOS und WIA_IPS_ROTATION gespeichert sind. Die IWiaPropertyStorage-Schnittstelle und ihre Methoden werden in der Windows SDK-Dokumentation beschrieben.

Eine Anwendung ruft eine instance des Segmentierungsfilters durch Aufrufen von IWiaItem2::GetExtension (in der Windows SDK-Dokumentation beschrieben) ab. Eine Anwendung ruft diese Methode in der Regel auf, bevor das Vorschaufenster angezeigt wird. Dies liegt daran, dass ein Treiber möglicherweise keinen Segmentierungsfilter enthält. In diesem Fall sollte die Benutzeroberfläche wissen, dass keine nicht unterstützte Schaltfläche angezeigt wird, z. B. Segmentierung ausführen.