Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
A partir do Windows Vista, o WIA suportará 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. Este 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, esta é uma imagem de visualização que representa toda a superfície de digitalização do scanner de mesa. O fluxo é criado pelo aplicativo em seu método IWiaTransferCallback::GetNextStream ; Este 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. Este 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 o pInputStream foi adquirido. Também é referido como o item pai. Por exemplo, o item para o qual pWiaItem2 aponta pode ser o item de cama plana.
O método IWiaSegmentationFilter::D etectRegions é usado para determinar as sub-regiões da imagem representadas por pInputStream. Para cada sub-região detetada, 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 examinada. 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 suportar 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 detetou três imagens na mesa digitalizadora e, para cada imagem, criou um novo item filho sob o item de mesa plana.
Um filtro de segmentação deve suportar todos os formatos de imagem suportados pelo driver que ele estende. O filtro de segmentação fornecido pela Microsoft suporta os formatos BMP, GIF, JPEG, PNG e TIFF. Assim, qualquer driver que usa esse filtro é limitado a esses formatos.
Para criar os itens subordinados, o filtro de segmentação chama o método IWiaItem2::CreateChildItem . Segue-se um exemplo desse apelo:
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, como demonstrado no trecho de código anterior, instrui o serviço WIA a definir todas as propriedades WIA legíveis e graváveis do item filho para os mesmos valores dos do item pai. O motivo pelo qual um filtro de segmentação deve passar esse sinalizador é garantir que as propriedades, como formato de imagem e resolução no item filho recém-criado, sejam as mesmas que as do 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 scanner.
É importante notar que o filtro de segmentação está vinculado às mesmas restrições que um aplicativo no que ele pode e não pode fazer. Isso significa que uma aplicação pode alterar os sub-itens 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 detetou e pode dizer ao aplicativo para modificar essa região arrastando seus cantos. A aplicação também pode eliminar subitens criados pelo filtro de segmentação, assim como adicionar novos.
Tenha em conta que o filtro de segmentação não tem a responsabilidade de "limpar" os itens filho que criou. Portanto, se a aplicação chama IWiaSegmentationFilter::DetectRegions mais de uma vez, a aplicação deve primeiro excluir os itens filhos criados na primeira chamada para o método IWiaSegmentationFilter::DetectRegions. O filtro de segmentação também não é responsável por redefinir o parâmetro pInputStream . O aplicativo deve garantir que definiu 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 superfície plana. Para digitalização de filmes, um scanner geralmente vem com quadros fixos, caso em que o driver cria os itens filho (consulte WIA Scanner Item Tree Layout para obter mais informações). Nesse caso, um aplicativo não deve invocar o filtro de segmentação para deteção de região e criação de itens filho.
Se um driver vem com um filtro de segmentação, ele deve implementar a propriedade WIA_IPS_SEGMENTATION para seus itens WIA de mesa e filme. 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 deteção de região em um determinado item.
Se um scanner utilizar quadros fixos para a digitalização de películas, ele definirá essa propriedade como WIA_DONT_USE_SEGMENTATION_FILTER no objeto de película. Neste caso, o aplicativo não deve tentar carregar o filtro de segmentação após a visualização 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::DetectRegions, é possível que o filtro de segmentação use algoritmos diferentes dependendo da categoria do item, ou seja, flatbed ou filme. A categoria de um item é armazenada na propriedade WIA_IPA_ITEM_CATEGORY .
Se um aplicativo alterar quaisquer 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 . A razão pela qual essas alterações precisam ser restauradas é que pode haver informações no item WIA que são 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, caso em que a interface do usuário deve saber não exibir um botão sem suporte, como Executar segmentação.