2009-08-22 14 views
7

Intentando crear una aplicación de adquisición de imágenes optimizada para un escáner rápido (que puede proporcionar hasta 6 imágenes comprimidas [color + gris + binario] [frontal + posterior] para cada papel a una velocidad de 150 ppm) Tengo algo de velocidad cuestiones. Uso de la tecnología TWAIN y el modo de transferencia del búfer de memoria (TWSX_MEMORY) Recibo el búfer de imagen (como archivo JPEG o TIFF cargado en la memoria) del escáner y lo guardo en la ruta de destino de mi aplicación. Si no quiero crear miniaturas, mi aplicación no causa ninguna pérdida de velocidad para el escáner, pero si quiero, debido a la forma en que lo hago (guardando el búfer en un archivo en mi dll de manejo de TWAIN en C++, notificando a mi host .NET aplicación con ruta de archivo de destino usando un puntero de función, abriendo el archivo de imagen en C# y creando la imagen en miniatura), mi aplicación causa una pérdida de velocidad extrema a la velocidad de escaneo. Intenté algunas optimizaciones, como realizar una fase de carga en un subproceso separado y enviar un búfer de archivo de imagen no administrado al host .NET e intentar cargarlo en un contexto inseguro (UnmanagedMemoryStream) y crear una miniatura. Pero no mejoró la velocidad significativamente. Entonces mi pregunta es:Tener un búfer de archivo de imagen en la memoria, ¿cuál es la forma más rápida de crear su miniatura?

Al tener un búfer de archivos de imágenes en la memoria (por ejemplo, 24 bits JPEG comprimidos sin una miniatura embebida), ¿hay una forma rápida y directa de crear una imagen en miniatura? ¿Qué sugieres como método más rápido para crear miniaturas en este caso?

Respuesta

7

Si se trata de una imagen JPEG, simplemente puede descartar la mayoría de los datos DCT y crear una miniatura a una potencia de dos tamaños, utilizando solo los coeficientes DCT.

Si puede encontrar las fuentes para ello, eche un vistazo a EPEG del proyecto Enlightenment. Hace exactamente lo que está buscando con archivos JPEG, sin decodificar ni descomprimir la imagen. El código fuente sería muy instructivo.

Para otros formatos de imagen, no es tan simple: deberá decodificar y renderizar la imagen en un búfer de memoria, y luego realizar su propia escala. Las bibliotecas CImg y boost :: GIL pueden ayudar con eso.

+0

Gracias, parece ser lo que quería. –

+1

He logrado probar EPEG, para cualquiera interesado en hacer lo mismo, debo mencionar que parece que la biblioteca EPEG ahora ha sido eliminada del código fuente de iluminación, por lo que debe buscarla dentro de sus viejos códigos fuente, por ejemplo aquí: http://download.enlightenment.org/snapshots/2008-01-25/. –

+0

Para imágenes TIFF, utilicé este código: http://www.koders.com/c/fidFAE1882A0596B9D224D831B852AE9891D0154D6D.aspx. No es tan rápido como EPEG, pero hace el trabajo. –

3

Supongo que el problema es que lleva más tiempo convertir una imagen en una miniatura que adquirir la imagen en primer lugar, ¿correcto?

Aunque un programa de conversión de miniaturas más rápido puede solucionar el problema, puede que no sea suficiente para alguien con una computadora más lenta. En su lugar, sugiero crear una cola de imágenes para convertirlas a miniaturas, es decir, tiene un hilo (o proceso) que agrega imágenes escaneadas a la cola, y otro hilo/proceso que elimina imágenes de esa cola y crea miniaturas de ellas. De esta manera, las velocidades relativas de las dos operaciones no importan.

+0

Gracias por la respuesta, Ya he probado este método, mejora el rendimiento significativamente pero aún no es lo suficientemente rápido. No estoy seguro de estar haciéndolo correctamente, pero debería agregar una llamada a Application.DoEvents() a mi código C# para hacer que mi control de miniaturas (lleno de miniaturas creadas en otro hilo) se invalide y todo el proceso siga hace que el escáner espere un momento (menos de un segundo) después de escanear más de 5 documentos. En comparación con una aplicación comercial incluida con el dispositivo (que estoy tratando de clonar su velocidad y agregar funciones que necesito) no es lo suficientemente rápido. –

+0

Lamentablemente, no estoy familiarizado con C# (o TWAIN para el caso), pero no puedo entender cómo los resultados de la cola podrían ralentizar el escáner. Supongo que ha establecido la prioridad del proceso/subproceso de conversión de miniaturas por debajo del proceso/subproceso de adquisición. Esa es una posible causa para considerar. –

+0

Gracias de nuevo, No estoy seguro, me parece que los subprocesos de C# que no sean el subproceso principal siempre tienen una prioridad menor que el subproceso principal.Sin embargo, la siguiente respuesta (greyfade) parece ser una solución más funcional para lo que necesito. –

Cuestiones relacionadas