다음을 통해 공유


구분 필터에 대한 인터페이스

Windows Vista부터 WIA는 구분 필터를 지원합니다. 구분 필터는 IWiaSegmentationFilter 인터페이스를 구현해야 합니다.

IWiaSegmentationFilter 인터페이스는 이 섹션 전체에서 사용되는 새(Windows Vista의 경우) 인터페이스 IWiaItem2에 종속되어 IWiaItem의 상위 집합입니다. IWiaItem 메서드 외에도 IWiaItem2 인터페이스에는 분할 필터를 포함하여 WIA 확장을 만드는 데 애플리케이션에서 사용하는 IWiaItem2::GetExtension 메서드가 포함되어 있습니다. IWiaItemIWiaItem2 인터페이스는 Microsoft Windows SDK 설명서에 설명되어 있습니다.

IWiaSegmentationFilter 인터페이스는 단일 메서드 DetectRegions를 구현합니다. 이 메서드에는 lFlags, pInputStreampWiaItem2의 세 가지 매개 변수가 있습니다.

lFlags 매개 변수는 현재 사용되지 않습니다.

pInputStream 매개 변수는 구분을 수행할 이미지에 대한 포인터입니다. 일반적으로 이 이미지는 플랫베드 전체 스캔 표면을 나타내는 미리 보기 이미지입니다. 스트림은 IWiaTransferCallback::GetNextStream 메서드에서 애플리케이션에 의해 생성됩니다. 이 메서드는 이미지를 획득하는 동안 호출됩니다. 드라이버는 IWiaTransferCallback::GetNextStream 메서드가 반환하는 스트림에 획득한 이미지 데이터를 씁니다. 애플리케이션에서 구분 필터로 전달해야 하는 스트림이기도 합니다. IWiaTransferCallback 인터페이스는 Windows SDK 설명서에 설명되어 있습니다.

pWiaItem2 매개 변수는 pInputStream을 획득한 WIA 항목에 대한 포인터입니다. 부모 항목이라고도 합니다. 예를 들어 pWiaItem2 가 가리키는 항목은 플랫베드 항목일 수 있습니다.

IWiaSegmentationFilter::D etectRegions 메서드는 pInputStream으로 표시되는 이미지의 하위 영역을 확인하는 데 사용됩니다. 검색된 각 하위 리소스에 대해 IWiaSegmentationFilter::D etectRegionspWiaItem2가 가리키는 항목 아래에 새 자식 WIA 항목을 만듭니다. 각 자식 항목에 대해 세분화 필터는 WIA_IPS_XPOS, WIA_IPS_YPOS, WIA_IPS_XEXTENTWIA_IPS_YEXTENT WIA 속성에 대한 값을 설정해야 합니다. 이러한 속성은 검사할 영역의 경계 사각형을 나타냅니다. 고급 세분화 필터는 드라이버가 deskewing을 지원하는 경우 세분화 필터에 대한 WIA 속성과 같은 다른 WIA 속성을 설정할 수도 있습니다.

다음 다이어그램에서는 구분 필터가 애플리케이션 항목 트리를 수정하는 방법을 보여 있습니다. 이 다이어그램에서 세분화 필터는 플랫베드에서 세 개의 이미지를 감지했으며 각 이미지에 대해 플랫베드 항목 아래에 새 자식 항목을 만들었습니다.

구분 필터가 애플리케이션 항목 트리를 수정하는 방법을 보여 주는 다이어그램

구분 필터는 확장되는 드라이버에서 지원하는 모든 이미지 형식을 지원해야 합니다. Microsoft에서 제공하는 구분 필터는 BMP, GIF, JPEG, PNG 및 TIFF 형식을 지원합니다. 따라서 이 필터를 사용하는 모든 드라이버는 이러한 형식으로 제한됩니다.

자식 항목을 만들기 위해 구분 필터는 IWiaItem2::CreateChildItem 메서드를 호출합니다. 다음은 이러한 호출의 예입니다.

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

lCreationFlags = COPY_PARENT_PROPERTY_VALUES;

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

IWiaItem2::CreateChildItemIWiaItem::CreateChildItem과 약간 다릅니다. IWiaItem2::CreateChildItem 메서드에는 lCreationFlags라는 새 매개 변수가 있습니다. IWiaItem2::CreateChildItem 메서드의 lItemFlags 매개 변수는 IWiaItem::CreateChildItemlFlags 매개 변수에 해당합니다. 위의 코드 조각에 표시된 것처럼 lCreationFlags 매개 변수를 사용하여 COPY_PARENT_PROPERTY_VALUES WIA 서비스에 전달하면 WIA 서비스에 자식 항목의 모든 읽기 가능/쓰기 가능한 WIA 속성을 부모 항목과 동일한 값으로 설정하도록 지시합니다. 세분화 필터가 이 플래그를 전달해야 하는 이유는 새로 만든 자식 항목의 이미지 형식 및 해상도와 같은 속성이 부모 항목으로 되도록 하기 위한 것입니다. 분할 필터가 자식 항목에 설정할 익스텐트 속성은 이미지 해상도에 따라 달라지므로 해상도가 동일해야 합니다. 또한 애플리케이션이 미리 보기 구성 요소(Microsoft Windows SDK 설명서에 설명됨)를 사용하려는 경우 자식 항목에서 이미지 형식과 해상도가 동일해야 합니다. 최종 이미지를 획득하기 전에 애플리케이션은 해상도를 수정하여 스캐너에서 더 높은 품질의 이미지를 얻을 수 있습니다.

세분화 필터는 수행할 수 있는 작업과 수행할 수 없는 작업에서 애플리케이션과 동일한 제한 사항에 의해 바인딩됩니다. 즉, 애플리케이션은 구분 필터가 만드는 자식 항목을 수정할 수 있습니다. 예를 들어 사용자가 구분 필터가 검색된 지역에 만족하지 않을 수 있으며 모서리를 끌어 애플리케이션에 이 지역을 수정하도록 지시할 수 있습니다. 애플리케이션은 분할 필터에서 만든 자식 항목을 삭제하고 새 항목을 추가할 수도 있습니다.

세분화 필터는 만든 자식 항목을 "정리"할 책임이 없습니다. 따라서 애플리케이션이 IWiaSegmentationFilter::D etectRegions 를 두 번 이상 호출하는 경우 애플리케이션은 먼저 IWiaSegmentationFilter::D etectRegions 메서드에 대한 첫 번째 호출에서 만든 자식 항목을 삭제해야 합니다. 또한 분할 필터는 pInputStream 매개 변수를 다시 설정할 책임이 없습니다. 애플리케이션은 구분 필터를 호출하기 전에 스트림의 시작 부분에 대한 검색 포인터를 설정했는지 확인해야 합니다.

세분화 필터는 필름 항목과 플랫베드 항목에서만 사용해야 합니다. 필름 스캔의 경우 스캐너는 고정 프레임과 함께 제공되는 경우가 많으며, 이 경우 드라이버는 자식 항목을 만듭니다(자세한 내용은 WIA 스캐너 항목 트리 레이아웃 을 참조하세요). 이 경우 애플리케이션은 하위 항목의 지역 검색 및 만들기에 대한 구분 필터를 호출해서는 안 됩니다.

드라이버에 세분화 필터가 함께 제공되는 경우 플랫베드 및 필름 WIA 항목에 대한 WIA_IPS_SEGMENTATION 속성을 구현해야 합니다. 이 읽기 전용 속성에는 드라이버가 설정하는 WIA_USE_SEGMENTATION_FILTER 및 WIA_DONT_USE_SEGMENTATION_FILTER 두 개의 유효한 값이 있습니다. 이 속성을 사용하면 애플리케이션이 특정 항목의 지역 검색에 드라이버의 구분 필터를 사용해야 하는지 알 수 있습니다.

스캐너가 필름 스캔에 고정 프레임을 사용하는 경우 이 속성을 필름 항목의 WIA_DONT_USE_SEGMENTATION_FILTER 설정합니다. 이 경우 애플리케이션은 필름 미리 보기를 획득한 후 구분 필터를 로드하지 않아야 합니다. 대신 드라이버에서 만든 자식 항목을 열거해야 합니다. 이러한 자식 항목은 고정된 프레임을 나타냅니다.

WIA 항목이 IWiaSegmentationFilter::D etectRegions에 전달되기 때문에 항목의 범주(예: 플랫베드 또는 필름)에 따라 세분화 필터가 다른 알고리즘을 사용할 수 있습니다. 항목의 범주는 WIA_IPA_ITEM_CATEGORY 속성에 저장됩니다.

애플리케이션이 pInputStream에서 이미지를 획득하는 것과 IWiaSegmentationFilter::D etectRegions에 대한 애플리케이션 호출 간에 pWiaItem2의 속성을 변경하는 경우 원래 속성 설정(즉, 스트림을 획득할 때 항목이 가진 속성 설정)을 복원해야 합니다. 이 작업은 IWiaPropertyStorage::GetPropertyStreamIWiaPropertyStorage::SetPropertyStream 메서드를 사용하여 수행할 수 있습니다. 이러한 변경 내용을 복원해야 하는 이유는 WIA 항목에 세분화 필터에 필요한 정보가 있을 수 있지만 이미지 헤더에 저장되지 않기 때문입니다. 이러한 정보의 예로는 WIA_IPS_XPOS, WIA_IPS_YPOSWIA_IPS_ROTATION 속성에 저장된 데이터가 있습니다. IWiaPropertyStorage 인터페이스 및 해당 메서드는 Windows SDK 설명서에 설명되어 있습니다.

애플리케이션은 IWiaItem2::GetExtension(Windows SDK 설명서에 설명됨)을 호출하여 구분 필터의 instance 가져옵니다. 애플리케이션은 일반적으로 미리 보기 창을 표시하기 전에 이 메서드를 호출합니다. 드라이버에 세분화 필터가 제공되지 않을 수 있기 때문입니다. 이 경우 UI는 분할 수행과 같이 지원되지 않는 단추를 표시하지 않아야 합니다.