2009-08-22 15 views
7

Cercando di creare un'immagine che acquisisce l'applicazione ottimizzata per uno scanner veloce (che può fornire fino a 6 immagini compresse [colore + grigio + binario] [anteriore + posteriore] per ogni carta alla velocità di 150 ppm) Ho una certa velocità problemi. Utilizzo della tecnologia TWAIN e modalità di trasferimento del buffer di memoria (TWSX_MEMORY) Ricevo il buffer di immagini (come file JPEG o TIFF caricato in memoria) dallo scanner e lo salgo nel percorso di destinazione dell'applicazione. Se non voglio creare anteprime, la mia applicazione non causa alcuna perdita di velocità per lo scanner, ma se lo voglio, a causa del modo in cui lo faccio (salvando il buffer in un file nel mio dll di gestione TWAIN C++, notificando il mio host .NET. applicazione con percorso file di destinazione utilizzando un puntatore a funzione, apertura del file immagine in C# e creazione dell'immagine di anteprima), la mia applicazione causa un'estrema perdita di velocità alla velocità di scansione. Ho provato alcune ottimizzazioni come l'esecuzione della fase di caricamento in un thread separato e l'invio di buffer di file di immagine non gestito su host .NET e cercando di caricarlo in un contesto non sicuro (UnmanagedMemoryStream) e creando una miniatura. Ma non ha migliorato significativamente la velocità. Quindi la mia domanda è:Avendo un buffer di file immagine in memoria, qual è il modo più veloce per creare la sua miniatura?

Avere un buffer di file immagine in memoria (ad esempio JPEG a 24 bit compresso senza miniatura incorporata), c'è un modo diretto veloce per creare un'immagine in miniatura da esso? Che cosa suggerisci come metodo più veloce per creare miniature in questo caso?

risposta

7

Se si tratta di un'immagine JPEG, è possibile semplicemente scartare la maggior parte dei dati DCT e creare una miniatura con una potenza di due dimensioni, utilizzando solo i coefficienti DCT.

Se è possibile trovare le fonti per esso, dare un'occhiata a EPEG dal progetto di illuminazione. Fa esattamente quello che stai cercando con i file JPEG, interamente senza decodifica o decompressione dell'immagine. Il codice sorgente sarebbe molto istruttivo.

Per altri formati di immagine, non è così semplice - sarà necessario decodificare e rendere l'immagine su un buffer di memoria, quindi eseguire il ridimensionamento. Le librerie CImg e boost :: GIL possono aiutarti.

+0

Grazie, sembra essere quello che volevo. –

+1

Sono riuscito a testare l'EPEG, per chiunque sia interessato a fare lo stesso, devo dire che sembra che la libreria EPEG sia stata rimossa dal codice sorgente dell'illuminazione, quindi dovresti cercarla all'interno dei suoi vecchi codici sorgente, per esempio qui: http://download.enlightenment.org/snapshots/2008-01-25/. –

+0

Per le immagini TIFF, ho utilizzato questo codice: http://www.koders.com/c/fidFAE1882A0596B9D224D831B852AE9891D0154D6D.aspx. Non è veloce come l'EPEG, ma porta a termine il lavoro. –

3

Suppongo che il problema sia che richiede più tempo per convertire un'immagine in una miniatura piuttosto che acquisire l'immagine in primo luogo, correggere?

Sebbene un programma di conversione di miniature più veloce possa risolvere il problema, potrebbe non essere sufficiente per qualcuno con un computer più lento. Invece, suggerisco di creare una coda di immagini da convertire in anteprime, ovvero un thread (o processo) che aggiunge immagini scansionate alla coda e un altro thread/processo che rimuove le immagini da quella coda e crea miniature da esse. In questo modo le velocità relative delle due operazioni non contano.

+0

Grazie per la risposta, Ho già provato questo metodo, migliora significativamente le prestazioni ma non è ancora abbastanza veloce. Non sono sicuro che lo stia facendo correttamente, ma dovrei aggiungere una chiamata Application.DoEvents() al mio codice C# per rendere invalido il controllo del visualizzatore di miniature (pieno di miniature create in qualche altro thread) e l'intero processo continua fa in modo che lo scanner attenda un momento (meno di un secondo) dopo aver scansionato più di 5 documenti. Confrontando con un'applicazione commerciale fornita con il dispositivo (che sto cercando di clonare la sua velocità e aggiungere funzionalità che mi servono) non è abbastanza veloce. –

+0

Purtroppo non ho familiarità con C# (o TWAIN per quella materia), ma non riesco a capire come i risultati della coda possano rallentare lo scanner. Suppongo che tu abbia impostato la priorità del thread/processo di conversione delle miniature al di sotto di quella del thread/processo di acquisizione? Questa è una possibile causa da considerare. –

+0

Grazie ancora, Non ne sono sicuro, mi sembra che i thread C# diversi dal thread principale abbiano sempre una priorità inferiore rispetto al thread principale.Tuttavia, la prossima risposta (greyfade) sembra essere una soluzione più funzionale a ciò di cui ho bisogno. –