Pregunta de Twain: ¿es posible escanear solo un documento desde el alimentador?

Estoy jugando con el código de http://www.codeproject.com/KB/dotnet/twaindotnet.aspx

Tengo un problema porque Twain devuelve el control solo después de que se hayan escaneado todos los documentos del alimentador. Esto conduce a un alto uso de memoria si escaneo 20 o más documentos.

Pensé en escanear solo un documento a la vez desde el alimentador, guardar la imagen y volver a llamar a la API en un bucle.

Estoy configurando cap_xfercount en 1 pero esto no parece ayudar:

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

¿Qué debo hacer para escanear un solo documento desde el alimentador? Cualquier sugerencia apreciada.

    Lamento no estar familiarizado con el proyecto twaindotnet, pero tengo mucha experiencia con el escaneo de documentos a través de TWAIN.

    Primero una nota: no todos los alimentadores de documentos pueden alimentar en modo de página única; Algunas familias de escáneres importantes siempre escanean todo en el alimentador una vez iniciado. Y, bastantes conductores TWAIN no cumplirán con XFERCOUNT = 1, sin importar lo que diga el estándar.

    Si intenta resolver el problema obligando al escáner a escanear “trabajos de una página”, estará limitado al conjunto (indeterminado) de escáneres que son compatibles con eso. El estándar TWAIN simplemente no requiere esta característica. (Pero sí, CAP_AUTOSCAN = FALSE y XFERCOUNT = 1 sería el combo para intentarlo).

    Hay una mejor solución (si el tiempo y la paciencia lo permiten): parece que lo que quiere hacer es procesar y desechar cada imagen a medida que llega, en lugar de recostackrlas todas en la memoria. Averigüe cómo hacer que su biblioteca TWAIN le entregue cada imagen (o escríbala en un archivo) a medida que llega en lugar de astackrlas en la memoria, y tendrá una solución que funciona con todos los escáneres de alimentación de documentos. Y también se escaneará un poco más rápido con la mayoría de los escáneres …

    Este es un problema de alimentación. ¿Ha intentado configurar la capacidad habilitada para el alimentador a falso?

    EDITAR:

    Parece que CAP_AUTOFEED es el camino a seguir. Según la especificación TWAIN 2.0 :

    CAP_AUTOFEED Descripción Si es VERDADERO, la Fuente alimentará automáticamente la página siguiente desde el alimentador de documentos una vez que se adquiera el número de cuadros negociados para la captura de cada página. CAP_FEEDERENABLED debe ser VERDADERO para usar esta capacidad. Aplicación Establezca la capacidad en VERDADERO para habilitar el proceso de alimentación automática de la Fuente, o FALSO para deshabilitarla. Después de completar cada transferencia, verifique TW_PENDINGXFERS. Cuenta para determinar si la Fuente tiene más imágenes para transferir. Un -1 significa que hay más imágenes para transferir, pero se desconoce el número exacto. CAP_FEEDERLOADED indica si el alimentador de Source está cargado. (El proceso de alimentación automática continúa siempre que esta capacidad sea VERDADERA).

    El orden de las capacidades es importante, consulte este documento http://www.twain.org/docs/CapOrderForWeb .

    EDITAR:

    Estos son algunos fragmentos de código de una solución.

    Configurar la alimentación automática

     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); 

    y luego, cuando se envía el mensaje de la ventana Twain

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

    Finalmente reinicie el escáner para el siguiente documento

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