IWiaSegmentationFilter::D etectRegions-Methode
Bestimmt die Teilbereiche eines Bilds, das auf der Flachbettplatte angeordnet ist, sodass jeder Teilbereich in einem separaten Bildelement erfasst werden kann.
Syntax
HRESULT DetectRegions(
[in] LONG lFlags,
[in] IStream *pInputStream,
[in] IWiaItem2 *pWiaItem2
);
Parameter
-
lFlags [in]
-
Typ: LONG
Derzeit nicht verwendet. Sollte auf Null festgelegt werden.
-
pInputStream [in]
-
Typ: IStream*
Gibt einen Zeiger auf das IStream-Vorschaubild an.
-
pWiaItem2 [in]
-
Typ: IWiaItem2*
Gibt einen Zeiger auf das IWiaItem2-Element an, für das pInputStream abgerufen wurde. Der Segmentierungsfilter erstellt untergeordnete Elemente für dieses Element.
Rückgabewert
Typ: HRESULT
Wenn diese Methode erfolgreich ist, wird S_OK zurückgegeben. Andernfalls wird ein HRESULT-Fehlercode zurückgegeben.
Bemerkungen
Diese Methode bestimmt die Teilbereiche des Bilds, das durch pInputStream dargestellt wird. Für jeden erkannten Unterbereich wird ein untergeordnetes Element für das IWiaItem2-Element erstellt, das im pWiaItem2-Parameter angegeben ist. Für jedes untergeordnete Element muss der Segmentierungsfilter Werte für das umgebende Rechteck des zu scannenden Bereichs festlegen, wobei die folgenden Wia-Elementeigenschaftenkonstanten des Scanners verwendet werden.
Ein erweiterter Filter erfordert möglicherweise auch andere Scanner-WIA-Elementeigenschaftenkonstanten , z. B. WIA_IPS_DESKEW_X und WIA_IPS_DESKEW_Y, wenn der Treiber das Deaktivieren von Skewings unterstützt.
Wenn die Anwendung IWiaSegmentationFilter::D etectRegions mehrmals aufruft , muss die Anwendung zuerst die untergeordneten Elemente löschen, die durch den letzten Aufruf von IWiaSegmentationFilter::D etectRegions erstellt wurden.
Wenn eine Anwendung Eigenschaften in pWiaItem2 ändert, müssen zwischen dem Abrufen des Bilds in pInputStream und dem Aufruf von IWiaSegmentationFilter::D etectRegions die ursprünglichen Eigenschaften (d. h. die Eigenschaften, die das Element beim Abrufen des Datenstroms hatte) wiederhergestellt werden. Dies kann durch GetPropertyStream und SetPropertyStream erfolgen.
Die Anwendung muss den IStream zurücksetzen, wenn ihr Aufruf denselben Stream mehrmals an den Segmentierungsfilter übergibt. Die Anwendung muss den Stream auch nach dem ersten Download und vor dem Aufruf von IWiaSegmentationFilter::D etectRegions zurücksetzen.
Beispiele
Die Segmentierung führt die Regionserkennung für den Stream (pImageStream
) durch, der an DetectSubregions übergeben wird. Siehe die getExtension für CreateSegmentationFilter-Methode, die in diesem Beispiel verwendet wird.
HRESULT
DetectSubregions(
IN IStream *pImageStream,
IN IWiaItem2 *pWiaItem2)
{
HRESULT hr = S_OK;
IWiaSegmentationFilter* pSegmentationFilter = NULL;
if (!pWiaItem2 || !pImageStream)
{
hr = E_INVALIDARG;
}
if (SUCCEEDED(hr))
{
hr = CreateSegmentationFilter(pWiaItem2, &pSegmentationFilter);
}
if (SUCCEEDED(hr))
{
hr = pSegmentationFilter->DetectRegions(0,pImageStream, pWiaItem2);
}
if (pSegmentationFilter)
{
pSegmentationFilter->Release();
pSegmentationFilter = NULL;
}
return hr;
}
DownloadPreviewImage lädt Bilddaten aus dem Scanner herunter, indem die GetNewPreview-Methode der Vorschaukomponente aufgerufen wird. Anschließend wird DetectSubregions aufgerufen, wenn der Anwendungsbenutzer den Segmentierungsfilter aufrufen möchte, der ein untergeordnetes Element unter pWiaItem2 für jede erkannte Region erstellt. Die in diesem Beispiel verwendete DetectSubregions-Methode finden Sie unter IWiaSegmentationFilter::D etectRegions .
In diesem Beispiel legt m_bUseSegmentationFilter
der Anwendungsbenutzer durch Klicken auf ein Kontrollkästchen fest. Wenn die Anwendung dies unterstützt, sollte sie zunächst überprüfen, ob der Treiber über einen Segmentierungsfilter verfügt, indem CheckExtension aufgerufen wird. Unter GetNewPreview finden Sie ein Beispiel für die CheckImgFilter-Methode, das zeigt, wie dies geschehen kann.
HRESULT
DownloadPreviewImage(
IN IWiaItem2 *pWiaFlatbedItem2)
{
HRESULT hr = S_OK;
BOOL bHasImgFilter = FALSE;
IWiaTransferCallback *pAppWiaTransferCallback = NULL;
hr = CheckImgFilter(pWiaFlatbedItem2, &bHasImgFilter)
if (SUCCEEDED(hr))
{
if (bHasImgFilter)
{
IWiaPreview *pWiaPreview = NULL;
// In this example, the AppWiaTransferCallback class implements
// the IWiaTransferCallback interface.
// The constructor of AppWiaTransferCallback sets the reference count
// to 1.
pAppWiaTransferCallback = new AppWiaTransferCallback();
hr = pAppWiaTransferCallback ? S_OK : E_OUTOFMEMORY;
if (SUCCEEDED(hr))
{
// Acquire image from scanner
hr = m_pWiaPreview->GetNewPreview(pWiaFlatbedItem2,
0,
pAppWiaTransferCallback);
}
//
// Check the application UI for whether the user wants
// to use the segmentation filter indicated by the value
// of m_bUseSegmentationFilter.
//
// m_FlatbedPreviewStream is the stream that
// AppWiaTransferCallback::GetNextStream returned for the
// flatbed item.
// This stream is where the image data is stored after
// the successful return of GetNewPreview.
// The stream is passed into the segmentation filter
// for region detection.
if (SUCCEEDED(hr) && m_bUseSegmentationFilter)
{
DetectSubregions(m_FlatbedPreviewStream, pWiaFlatbedItem2);
}
if (pAppWiaTransferCallback)
{
// If the call to GetNewPreview was successful, the
// preview component calls AddRef on the callback so
// this call doesn't delete the object.
pAppWiaTransferCallback->Release();
}
}
else
{
// Do not create an instance of preview component if the driver
// does not come with an image-processing filter.
// You can use a segmentation filter, however, if the driver
// comes with one (omitted here).
}
}
return hr;
}
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) |
Windows Vista [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) |
Windows Server 2008 [nur Desktop-Apps] |
Header |
|
IDL |
|