Beispiel: Anwendung mit einem Segmentierungsfilter
Das folgende Codebeispiel zeigt, wie eine einfache Anwendung den Segmentierungsfilter verwenden kann. Zur Übersichtlichkeit wurden Fehlerüberprüfungscode sowie Code zum Freigeben und Freigeben von Schnittstellenzeigern und Arbeitsspeicher weggelassen.
IWiaSegmentationFilter *pWiaSegmentationFilter = NULL;
IWiaTransferCallback *pMyWiaTransferCallback = NULL;
IWiaTransfer *pWiaTransfer = NULL;
...
pWiaItem2->QueryInterface(IID_IWiaTransfer, (void**)&pWiaTransfer);
pMyWiaTransferCallback = new MyWiaTransferCallback();
//
// Do preview scan.
//
pWiaTransfer->Download(lFlags, pMyWiaTransferCallback);
//
// If an application changes any properties in pWiaItem2, it
// should call IWiaPropertyStorage::GetPropertyStream on
// that item to save its property settings (so they can be
// restored) before calling IWiaSegmentationFilter::DetectRegions.
//
if (ReadPropertyLong(WIA_IPS_SEGMENTATION_FILTER, &lUseSegFilter) &&
(lUseSegFilter == WIA_USE_SEGMENTATION_FILTER)
{
bstrSegmentation = SysAllocStr(WIA_SEGMENTATION_FILTER_STR);
pWiaItem2->GetExtension(bstrSegmentation,
IID_IWiaSegmentationFilter,
(void**)& pWiaSegmentationFilter);
//
// m_pInputStream is a pointer to the IStream that the application's
// implementation of MyWiaTransferCallback::GetNextStream
// returns.
//
// Note: If the application has changed any properties into
// pWiaItem2 since the call to Download, it must now restore
// these properties with IWiaPropertyStorage::SetPropertyStream.
//
//
// The application is responsible for resetting m_pInputStream
// before calling DetectRegions!
//
LARGE_INTEGER ul = {0};
m_pInputStream->Seek(ul, STREAM_SEEK_SET, NULL);
pWiaSegmentationFilter->DetectRegions(m_pInputStream,
pWiaItem2);
...
}
//
// Display the subregions to the users (if segmentation was
// supported) and let them pick the images they want to scan,
// as well as change the properties in the child items
//
// For each child item, pChildItem, do the following ( alternatively,
// do a folder acquisition on pWiaItem2).
//
IWiaTransfer *pWiaTransferChild= NULL;
pChildItem->QueryInterface(IID_IWiaTransfer,
(void**)& pWiaTransferChild);
pWiaTransferChild->Download(lFlags, pMyWiaTransferCallback);