Pergunta de Twain: é possível digitalizar apenas um documento do alimentador?

Eu estou jogando com o código de http://www.codeproject.com/KB/dotnet/twaindotnet.aspx

Estou tendo um problema porque o twain só retorna o controle depois que todos os documentos no alimentador são verificados. Isso leva a um alto uso de memory se eu digitalizar 20 ou mais documentos.

Pensei em digitalizar apenas um documento de cada vez no alimentador e salvar a imagem e chamar a API novamente em um loop.

Estou definindo cap_xfercount como 1, mas isso não parece ajudar:

TwCapability cap = new TwCapability(TwCap.XferCount, 1); rc = DScap(appid, srcds, TwDG.Control, TwDAT.Capability, TwMSG.Set, cap); 

O que preciso fazer para digitalizar apenas um documento do alimentador? Qualquer sugestão apreciada.

    Sinto muito que não esteja familiarizado com o projeto twaindotnet, mas tenho muita experiência com a digitalização de documentos através do TWAIN.

    Primeiro uma nota: Nem todos os alimentadores de documentos podem alimentar no modo de página única; algumas famílias importantes de scanners sempre escaneiam tudo no alimentador, uma vez iniciado. E, alguns drivers TWAIN não honram XFERCOUNT = 1, não importa o que o padrão diga.

    Se você tentar resolver o problema forçando o scanner a escanear “tarefas de uma página”, você estará limitado ao conjunto (indeterminado) de scanners que o suportam. O padrão TWAIN simplesmente não requer esse recurso. (Mas sim – CAP_AUTOSCAN = FALSE e XFERCOUNT = 1 seria o combo para tentar.)

    Existe uma solução melhor (tempo e paciência) – Parece que o que você quer fazer é processar e descartar cada imagem à medida que ela chega, em vez de coletá-las todas na memory. Descubra como fazer com que sua biblioteca TWAIN entregue a você cada imagem (ou grave em um arquivo) à medida que ela chega, em vez de empilhá-las na memory, e você terá uma solução que funcione com todos os scanners de alimentação de documentos. E vai escanear um pouco mais rápido com a maioria dos scanners, também …

    Este é um problema de feeder. Você tentou configurar o recurso ativado pelo alimentador como falso?

    EDITAR:

    Parece que o CAP_AUTOFEED é o caminho a percorrer. De acordo com a especificação TWAIN 2.0 :

    CAP_AUTOFEED Descrição Se TRUE, a Origem alimentará automaticamente a próxima página do alimentador de documentos depois que o número de frameworks negociados para captura de cada página for adquirido. CAP_FEEDERENABLED deve ser TRUE para usar esse recurso. Aplicação Defina a capacidade de TRUE para ativar o processo de alimentação automática da Fonte ou FALSE para desativá-lo. Após a conclusão de cada transferência, verifique TW_PENDINGXFERS. Conte para determinar se a Origem tem mais imagens para transferir. A -1 significa que há mais imagens para transferir, mas o número exato não é conhecido. CAP_FEEDERLOADED indica se o alimentador da fonte está carregado. (O processo de alimentação automática continua sempre que esse recurso for TRUE.)

    A ordem das capacidades é importante, veja este documento http://www.twain.org/docs/CapOrderForWeb .

    EDITAR:

    Estes são alguns fragments de código de uma solução

    Configurar o feed automático

     capFeederEnabled = _twEntities.GetCapability(TwCap.FeederEnabled, (short)1); TwRC rc = DScap(_applicationId, _sourceId, TwDG.Control, TwDAT.Capability, TwMSG.Set, capFeederEnabled); TwCapability cap = _twEntities.GetCapability(TwCap.XferCount, 1); rc = DScap(_applicationId, _sourceId, TwDG.Control, TwDAT.Capability, TwMSG.Set, cap); 

    e, em seguida, quando o quando a mensagem de janela Twain é enviada

     rc = DSixfer(_applicationId, _sourceId, TwDG.Image, TwDAT.ImageNativeXfer, TwMSG.Get, ref hbitmap); rc = DSpxfer(_applicationId, _sourceId, TwDG.Control, TwDAT.PendingXfers, TwMSG.EndXfer, pxfr); 

    finalmente redefinir o scanner para o próximo documento

     rc = DSpxfer(_applicationId, _sourceId, TwDG.Control, TwDAT.PendingXfers, TwMSG.Reset, pxfr);