2009-08-22 13 views
7

Der Versuch, eine für einen schnellen Scanner optimierte Bilderfassungsanwendung zu erstellen (die bis zu 6 komprimierte Bilder [Farbe + Grau + Binär] [vorne + hinten] für jedes Papier bei einer Geschwindigkeit von 150 ppm liefern kann) habe etwas Geschwindigkeit Probleme. Verwenden der TWAIN-Technologie und des Speicherpuffer-Übertragungsmodus (TWSX_MEMORY) Ich empfange den Bildpuffer (als JPEG- oder TIFF-Datei im Speicher geladen) vom Scanner und speichere ihn im Zielpfad meiner Anwendung. Wenn ich keine Thumbnails erstellen möchte, verursacht meine Anwendung keinen Geschwindigkeitsverlust für den Scanner, aber wenn ich möchte, so wie ich es mache (Speichern des Puffers in einer Datei in meiner C++ TWAIN-Handling-DLL, Benachrichtigen meines .NET-Hosts) Anwendung mit dem Zieldateipfad unter Verwendung eines Funktionszeigers, Öffnen der Bilddatei in C# und Erstellen des Miniaturbilds), führt meine Anwendung zu extremer Geschwindigkeitseinbuße bei der Abtastgeschwindigkeit. Ich habe einige Optimierungen versucht, zum Beispiel die Ladephase in einem separaten Thread durchzuführen und den nicht verwalteten Image-Dateipuffer an den .NET-Host zu senden und zu versuchen, ihn in einem unsicheren Kontext (UnmanagedMemoryStream) zu laden und ein Thumbnail zu erstellen. Aber es hat die Geschwindigkeit nicht wesentlich verbessert. Meine Frage ist also:Haben Sie einen Bilddateipuffer im Speicher? Was ist der schnellste Weg, um ein Miniaturbild zu erstellen?

Haben Sie einen Bilddateipuffer im Speicher (z. B. 24-Bit JPEG komprimiert ohne eingebettete Miniaturansicht), gibt es eine schnelle direkte Möglichkeit, ein Miniaturbild daraus zu erstellen? Was empfehlen Sie als schnellste Methode zum Erstellen von Thumbnails in diesem Fall?

Antwort

7

Wenn es sich um ein JPEG-Bild handelt, können Sie einfach die meisten DCT-Daten verwerfen und ein Miniaturbild mit einer Zweierpotenz erstellen, indem Sie nur die DCT-Koeffizienten verwenden. Wenn Sie die Quellen dafür finden können, werfen Sie einen Blick auf EPEG aus dem Aufklärungsprojekt. Es macht genau das, was Sie mit JPEG-Dateien suchen, ganz ohne Dekodieren oder Dekomprimieren des Bildes. Der Quellcode wäre sehr aufschlussreich.

Für andere Bildformate ist es nicht so einfach - Sie müssen das Bild dekodieren und in einen Speicherpuffer rendern und dann Ihre eigene Skalierung durchführen. Die Bibliotheken CImg und boost :: GIL können dabei helfen.

+0

Danke, es scheint zu sein, was ich wollte. –

+1

Ich habe es geschafft, EPEG zu testen, für alle, die daran interessiert sind, das gleiche zu tun, sollte ich erwähnen, dass die EPEG-Bibliothek nun aus dem Erleuchtungsquellcode entfernt wurde, also sollten Sie sie in ihren alten Quellcodes suchen, zum Beispiel hier: http://download.enlightenment.org/snapshots/2008-01-25/. –

+0

Für TIFF-Bilder habe ich diesen Code verwendet: http://www.koders.com/c/fidFAE1882A0596B9D224D831B852AE9891D0154D6D.aspx. Es ist nicht so schnell wie EPEG, aber die Arbeit erledigt. –

3

Ich nehme an, dass das Problem ist, dass es länger dauert, ein Bild in ein Thumbnail zu konvertieren, als das Bild an erster Stelle zu erhalten, richtig?

Obwohl ein schnelleres Thumbnail-Konvertierungsprogramm das Problem für Sie möglicherweise beheben kann, reicht es möglicherweise für jemanden mit einem langsameren Computer nicht aus. Stattdessen empfehle ich, eine Reihe von Bildern zu erstellen, die in Miniaturansichten konvertiert werden sollen - d. H. Sie haben einen Thread (oder Prozess), der gescannte Bilder zur Warteschlange hinzufügt, und einen anderen Thread/Prozess, der Bilder aus dieser Warteschlange entfernt und Miniaturbilder daraus erstellt. Auf diese Weise sind die relativen Geschwindigkeiten der beiden Vorgänge nicht von Bedeutung.

+0

Danke für die Antwort, Ich habe diese Methode schon ausprobiert, es verbessert die Leistung erheblich, aber es ist noch nicht schnell genug. Ich bin mir nicht sicher, ob ich es richtig mache, aber ich sollte einen Application.DoEvents() -Aufruf zu meinem C# -Code hinzufügen, damit mein Thumbnail-Viewer-Steuerelement (gefüllt mit Thumbnails, die in einem anderen Thread erstellt wurden) ungültig wird und der ganze Prozess noch läuft bewirkt, dass der Scanner nach dem Scannen von 5 oder mehr Papieren einen Moment (weniger als eine Sekunde) wartet. Im Vergleich zu einer kommerziellen Anwendung, die mit dem Gerät ausgeliefert wird (ich versuche, seine Geschwindigkeit zu klonen und Funktionen hinzuzufügen, die ich brauche), ist es nicht schnell genug. –

+0

Leider bin ich nicht vertraut mit C# (oder TWAIN in der Tat), aber ich kann nicht verstehen, wie Warteschlangenergebnisse den Scanner verlangsamen könnten. Ich nehme an, dass Sie die Priorität des Thumbnail-Conversion-Threads/-Prozesses unter die des Akquisitionsthreads/-prozesses gesetzt haben. Das ist ein möglicher Grund, darüber nachzudenken. –

+0

Nochmals vielen Dank, Ich bin mir nicht sicher, es scheint mir, dass C# threads andere als Haupt-Thread immer eine niedrigere Priorität als Haupt-Thread haben.Die nächste Antwort (Greyfade) scheint jedoch eine funktionellere Lösung für das zu sein, was ich brauche. –

Verwandte Themen