Interfaces para filtros de segmentación
A partir de Windows Vista, WIA admitirá filtros de segmentación. Un filtro de segmentación debe implementar la interfaz IWiaSegmentationFilter.
La interfaz IWiaSegmentationFilter depende de la nueva interfaz (para Windows Vista) IWiaItem2, que se usa en esta sección, es un superconjunto de IWiaItem. Además de los métodos IWiaItem , la interfaz IWiaItem2 incluye el método IWiaItem2::GetExtension, que usa una aplicación para crear extensiones WIA, incluido el filtro de segmentación. Las interfaces IWiaItem e IWiaItem2 se describen en la documentación de Microsoft Windows SDK.
La interfaz IWiaSegmentationFilter implementa un único método, DetectRegions. Este método tiene tres parámetros, lFlags, pInputStream y pWiaItem2.
El parámetro lFlags no se usa actualmente.
El parámetro pInputStream es un puntero a la imagen en la que se va a realizar la segmentación. Normalmente se trata de una imagen de vista previa que representa toda la superficie de exploración de la cama plana. La secuencia la crea la aplicación en su método IWiaTransferCallback::GetNextStream ; se llama a este método durante la adquisición de imágenes. El controlador escribe los datos de imagen adquiridos en la secuencia que devuelve el método IWiaTransferCallback::GetNextStream . También es la secuencia que debe pasarse al filtro de segmentación por parte de la aplicación. La interfaz IWiaTransferCallback se describe en la documentación de Windows SDK.
El parámetro pWiaItem2 es un puntero al elemento WIA para el que se adquirió pInputStream . También se conoce como elemento primario. Por ejemplo, el elemento al que pWiaItem2 apunta podría ser el elemento plano.
El método IWiaSegmentationFilter::D etectRegions se usa para determinar las subregiones de la imagen representada por pInputStream. Para cada subregión detectada, IWiaSegmentationFilter::D etectRegions crea un nuevo elemento WIA secundario bajo el elemento al que apunta pWiaItem2. Para cada elemento secundario, el filtro de segmentación debe establecer los valores de las siguientes propiedades WIA: WIA_IPS_XPOS, WIA_IPS_YPOS, WIA_IPS_XEXTENT y WIA_IPS_YEXTENT. Estas propiedades representan el rectángulo delimitador del área que se va a examinar. Un filtro de segmentación más avanzado también puede querer establecer otras propiedades de WIA, como propiedades de WIA para filtros de segmentación si el controlador admite deskewing.
En el diagrama siguiente se muestra cómo el filtro de segmentación modifica el árbol de elementos de la aplicación. En este diagrama, el filtro de segmentación ha detectado tres imágenes en el plano y, para cada imagen, ha creado un nuevo elemento secundario bajo el elemento plano.
Un filtro de segmentación debe admitir todos los formatos de imagen admitidos por el controlador que extiende. El filtro de segmentación que Microsoft proporciona admite formatos BMP, GIF, JPEG, PNG y TIFF. Por lo tanto, cualquier controlador que use este filtro se limita a estos formatos.
Para crear los elementos secundarios, el filtro de segmentación llama al método IWiaItem2::CreateChildItem . A continuación se muestra un ejemplo de esta llamada:
lItemFlags = WiaItemTypeGenerated | WiaItemTypeTransfer | WiaItemTypeImage | WiaItemTypeFile |
WiaItemTypeProgrammableDataSource;
lCreationFlags = COPY_PARENT_PROPERTY_VALUES;
pWiaItem2->CreateChildItem(lItemFlags,
lCreationFlags,
bstrItemName,
&pChildItem);
IWiaItem2::CreateChildItem difiere ligeramente de IWiaItem::CreateChildItem. El método IWiaItem2::CreateChildItem tiene un nuevo parámetro, lCreationFlags; El parámetro lItemFlags del método IWiaItem2::CreateChildItem corresponde al parámetro lFlags de IWiaItem::CreateChildItem. Al pasar COPY_PARENT_PROPERTY_VALUES con el parámetro lCreationFlags al servicio WIA, como se muestra en el fragmento de código anterior, se indica al servicio WIA que establezca todas las propiedades WIA legibles y grabables del elemento secundario en los mismos valores que los de su elemento primario. El motivo por el que un filtro de segmentación debe pasar esta marca es asegurarse de que las propiedades, como el formato de imagen y la resolución en el elemento secundario recién creado, son como elemento primario. Es importante que la resolución sea la misma porque las propiedades de extensión que establecerá el filtro de segmentación en el elemento secundario dependen de la resolución de la imagen. También es importante que el formato de imagen y la resolución sean los mismos en el elemento secundario si una aplicación quiere usar el componente de vista previa (descrito en la documentación de Microsoft Windows SDK). Antes de adquirir la imagen final, una aplicación puede modificar la resolución para adquirir una imagen de mayor calidad del escáner.
Es importante tener en cuenta que el filtro de segmentación está enlazado por las mismas restricciones que una aplicación en lo que puede y no puede hacer. Esto significa que una aplicación puede modificar los elementos secundarios que crea el filtro de segmentación. Por ejemplo, es posible que un usuario no esté satisfecho con la región que detectó el filtro de segmentación y podría indicar a la aplicación que modifique esta región arrastrando sus esquinas. La aplicación también puede eliminar elementos secundarios creados por el filtro de segmentación, así como agregar otros nuevos.
Tenga en cuenta que el filtro de segmentación no es responsable de "limpiar" los elementos secundarios que creó. Por lo tanto, si la aplicación llama a IWiaSegmentationFilter::D etectRegions más de una vez, la aplicación debe eliminar primero los elementos secundarios creados en la primera llamada al método IWiaSegmentationFilter::D etectRegions . El filtro de segmentación tampoco es responsable de restablecer el parámetro pInputStream . La aplicación debe asegurarse de que ha establecido el puntero de búsqueda al principio de la secuencia antes de llamar al filtro de segmentación.
El filtro de segmentación solo debe usarse en el elemento de película y en el elemento plano. Para el escaneo de película, un escáner suele incluir fotogramas fijos, en cuyo caso el controlador crea los elementos secundarios (consulte Diseño de árbol de elementos del escáner WIA para obtener más información). En este caso, una aplicación no debe invocar el filtro de segmentación para la detección de regiones y la creación de elementos secundarios.
Si un controlador incluye un filtro de segmentación, debe implementar la propiedad WIA_IPS_SEGMENTATION para sus elementos WIA planos y de película. Esta propiedad de solo lectura tiene dos valores válidos: WIA_USE_SEGMENTATION_FILTER y WIA_DONT_USE_SEGMENTATION_FILTER, que establece el controlador. Esta propiedad permite a una aplicación saber si debe usar el filtro de segmentación del controlador para la detección de regiones en un determinado elemento.
Si un escáner usa fotogramas fijos para el examen de películas, esta propiedad se establecería en WIA_DONT_USE_SEGMENTATION_FILTER en el elemento de película. En este caso, la aplicación no debe intentar cargar el filtro de segmentación después de que se haya adquirido la versión preliminar de la película; en su lugar, debe enumerar los elementos secundarios creados por el controlador. Estos elementos secundarios representan los marcos fijos.
Dado que un elemento WIA se pasa a IWiaSegmentationFilter::D etectRegions, es posible que el filtro de segmentación use diferentes algoritmos en función de la categoría del elemento, es decir, plano o película. La categoría de un elemento se almacena en la propiedad WIA_IPA_ITEM_CATEGORY .
Si una aplicación cambia las propiedades de pWiaItem2 entre adquirir la imagen en pInputStream y la llamada de la aplicación a IWiaSegmentationFilter::D etectRegions, se debe restaurar la configuración de la propiedad original (es decir, la configuración de propiedad que tenía el elemento cuando se adquirió la secuencia). Esto se puede hacer mediante los métodos IWiaPropertyStorage::GetPropertyStream e IWiaPropertyStorage::SetPropertyStream . La razón por la que estos cambios deben restaurarse es que puede haber información en el elemento WIA necesario para el filtro de segmentación, pero que no se almacena en el encabezado de imagen. Algunos ejemplos de esta información son los datos almacenados en las propiedades WIA_IPS_XPOS, WIA_IPS_YPOS y WIA_IPS_ROTATION . La interfaz IWiaPropertyStorage y sus métodos se describen en la documentación de Windows SDK.
Una aplicación obtiene una instancia del filtro de segmentación llamando a IWiaItem2::GetExtension (que se describe en la documentación de Windows SDK). Normalmente, una aplicación llamaría a este método antes de mostrar su ventana de vista previa. Esto se debe a que un controlador podría no venir con un filtro de segmentación, en cuyo caso la interfaz de usuario debe saber no mostrar un botón no admitido, como Realizar segmentación.