Interfaces para filtros de segmentação
A partir do Windows Vista, o WIA dará suporte a filtros de segmentação. Um filtro de segmentação deve implementar a interface IWiaSegmentationFilter.
A interface IWiaSegmentationFilter depende da nova interface (para Windows Vista) IWiaItem2, que é usada ao longo desta seção, é um superconjunto de IWiaItem. Além dos métodos IWiaItem , a interface IWiaItem2 inclui o método IWiaItem2::GetExtension, que é usado por um aplicativo para criar extensões WIA, incluindo o filtro de segmentação. As interfaces IWiaItem e IWiaItem2 são descritas na documentação do SDK do Microsoft Windows.
A interface IWiaSegmentationFilter implementa um único método, DetectRegions. Esse método tem três parâmetros, lFlags, pInputStream e pWiaItem2.
O parâmetro lFlags não é usado no momento.
O parâmetro pInputStream é um ponteiro para a imagem na qual a segmentação deve ser executada. Normalmente, essa é uma imagem de visualização que representa toda a superfície de verificação do flatbed. O fluxo é criado pelo aplicativo em seu método IWiaTransferCallback::GetNextStream ; esse método é chamado durante a aquisição da imagem. O driver grava os dados de imagem adquiridos no fluxo que o método IWiaTransferCallback::GetNextStream retorna. Esse também é o fluxo que deve ser passado para o filtro de segmentação pelo aplicativo. A interface IWiaTransferCallback é descrita na documentação do SDK do Windows.
O parâmetro pWiaItem2 é um ponteiro para o item WIA para o qual pInputStream foi adquirido. Ele também é conhecido como o item pai. Por exemplo, o item para o qual pWiaItem2 aponta pode ser o item de flatbed.
O método IWiaSegmentationFilter::D etectRegions é usado para determinar as sub-regiões da imagem representada por pInputStream. Para cada sub-região detectada, IWiaSegmentationFilter::D etectRegions cria um novo item WIA filho sob o item apontado por pWiaItem2. Para cada item filho, o filtro de segmentação deve definir os valores para as seguintes propriedades wia: WIA_IPS_XPOS, WIA_IPS_YPOS, WIA_IPS_XEXTENT e WIA_IPS_YEXTENT. Essas propriedades representam o retângulo delimitador da área a ser digitalizada. Um filtro de segmentação mais avançado também pode querer definir outras propriedades wia, como propriedades WIA para filtros de segmentação se o driver der suporte ao deskewing.
O diagrama a seguir mostra como o filtro de segmentação modifica a árvore de itens do aplicativo. Neste diagrama, o filtro de segmentação detectou três imagens no flatbed e, para cada imagem, criou um novo item filho sob o item de flatbed.
Um filtro de segmentação deve dar suporte a todos os formatos de imagem compatíveis com o driver que ele estende. O filtro de segmentação que a Microsoft fornece dá suporte aos formatos BMP, GIF, JPEG, PNG e TIFF. Portanto, qualquer driver que usa esse filtro é limitado a esses formatos.
Para criar os itens filho, o filtro de segmentação chama o método IWiaItem2::CreateChildItem . Veja a seguir um exemplo dessa chamada:
lItemFlags = WiaItemTypeGenerated | WiaItemTypeTransfer | WiaItemTypeImage | WiaItemTypeFile |
WiaItemTypeProgrammableDataSource;
lCreationFlags = COPY_PARENT_PROPERTY_VALUES;
pWiaItem2->CreateChildItem(lItemFlags,
lCreationFlags,
bstrItemName,
&pChildItem);
IWiaItem2::CreateChildItem difere ligeiramente de IWiaItem::CreateChildItem. O método IWiaItem2::CreateChildItem tem um novo parâmetro, lCreationFlags; O parâmetro lItemFlags do método IWiaItem2::CreateChildItem corresponde ao parâmetro lFlags de IWiaItem::CreateChildItem. Passar COPY_PARENT_PROPERTY_VALUES com o parâmetro lCreationFlags para o serviço WIA, conforme mostrado no snippet de código anterior, informa ao serviço WIA para definir todas as propriedades WIA legíveis/graváveis do item filho com os mesmos valores que os do pai. O motivo pelo qual um filtro de segmentação deve passar esse sinalizador é para garantir que as propriedades, como formato de imagem e resolução no item filho recém-criado, sejam o como o item pai. É importante que a resolução seja a mesma porque as propriedades de extensão que o filtro de segmentação definirá no item filho dependem da resolução da imagem. Também é importante que o formato e a resolução da imagem sejam os mesmos no item filho se um aplicativo quiser usar o componente de visualização (descrito na documentação do SDK do Microsoft Windows). Antes de adquirir a imagem final, um aplicativo pode modificar a resolução para adquirir uma imagem de maior qualidade do verificador.
É importante observar que o filtro de segmentação está associado pelas mesmas restrições que um aplicativo no que ele pode ou não fazer. Isso significa que um aplicativo pode modificar os itens filho que o filtro de segmentação cria. Por exemplo, um usuário pode não estar satisfeito com a região que o filtro de segmentação detectou e pode instruir o aplicativo a modificar essa região arrastando seus cantos. O aplicativo também pode excluir itens filho criados pelo filtro de segmentação, bem como adicionar novos.
Observe que o filtro de segmentação não é responsável por "limpar" os itens filho que ele criou. Portanto, se o aplicativo chamar IWiaSegmentationFilter::D etectRegions mais de uma vez, o aplicativo deverá primeiro excluir os itens filho criados na primeira chamada para o método IWiaSegmentationFilter::D etectRegions . O filtro de segmentação também não é responsável por redefinir o parâmetro pInputStream . O aplicativo deve garantir que ele tenha definido o ponteiro de busca para o início do fluxo antes de chamar o filtro de segmentação.
O filtro de segmentação só deve ser usado no item de filme e no item de flatbed. Para verificação de filme, um scanner geralmente vem com quadros fixos, nesse caso, o driver cria os itens filho (consulte Layout da árvore de itens do scanner WIA para obter mais informações). Nesse caso, um aplicativo não deve invocar o filtro de segmentação para detecção de região e criação de itens filho.
Se um driver vier com um filtro de segmentação, ele deverá implementar a propriedade WIA_IPS_SEGMENTATION para seus itens WIA de filme e flatbed. Essa propriedade somente leitura tem dois valores válidos: WIA_USE_SEGMENTATION_FILTER e WIA_DONT_USE_SEGMENTATION_FILTER, que o driver define. Essa propriedade permite que um aplicativo saiba se ele deve usar o filtro de segmentação do driver para detecção de região em um determinado item.
Se um scanner usar quadros fixos para verificação de filme, ele definirá essa propriedade como WIA_DONT_USE_SEGMENTATION_FILTER no item de filme. Nesse caso, o aplicativo não deve tentar carregar o filtro de segmentação após a versão prévia do filme ter sido adquirida; Em vez disso, ele deve enumerar os itens filho criados pelo driver. Esses itens filho representam os quadros fixos.
Como um item WIA é passado para IWiaSegmentationFilter::D etectRegions, é possível que o filtro de segmentação use algoritmos diferentes dependendo da categoria do item, ou seja, flatbed ou film. A categoria de um item é armazenada na propriedade WIA_IPA_ITEM_CATEGORY .
Se um aplicativo alterar as propriedades em pWiaItem2 entre a aquisição da imagem em pInputStream e a chamada do aplicativo para IWiaSegmentationFilter::D etectRegions, as configurações de propriedade originais (ou seja, as configurações de propriedade que o item tinha quando o fluxo foi adquirido) deverão ser restauradas. Isso pode ser feito usando os métodos IWiaPropertyStorage::GetPropertyStream e IWiaPropertyStorage::SetPropertyStream . O motivo pelo qual essas alterações precisam ser restauradas é que pode haver informações no item WIA necessárias para o filtro de segmentação, mas que não são armazenadas no cabeçalho da imagem. Exemplos dessas informações são os dados armazenados nas propriedades WIA_IPS_XPOS, WIA_IPS_YPOS e WIA_IPS_ROTATION . A interface IWiaPropertyStorage e seus métodos são descritos na documentação do SDK do Windows.
Um aplicativo obtém uma instância do filtro de segmentação chamando IWiaItem2::GetExtension (descrito na documentação do SDK do Windows). Um aplicativo normalmente chamaria esse método antes de exibir sua janela de visualização. Isso ocorre porque um driver pode não vir com um filtro de segmentação; nesse caso, a interface do usuário deve saber não exibir um botão sem suporte, como Executar Segmentação.