2009-08-22 1 views
7

高速スキャナー用に最適化された画像取得アプリケーションを作成しようとしています(150 ppmの速度で各用紙に最大6つの圧縮画像[カラー+グレー+バイナリ] [フロント+リア]問題。 TWAINテクノロジとメモリバッファ転送モード(TWSX_MEMORY)スキャナからイメージバッファ(JPEGまたはTIFFファイルをメモリにロードしたもの)を受け取り、それをアプリケーションの宛先パスに保存します。 サムネイルを作成したくない場合は、私のアプリケーションはスキャナのスピードを落とさないようにしますが、私のやり方(バッファをC++ TWAIN処理DLLのファイルに保存し、.NETホスト関数ポインタを使用した宛先ファイルパスを持つアプリケーション、C#で画像ファイルを開いてサムネイル画像を作成する)、私のアプリケーションはスキャン速度を極端に低下させます。 別のスレッドでフェーズをロードし、管理されていないイメージファイルバッファを.NETホストに送信し、安全でないコンテキスト(UnmanagedMemoryStream)でロードしてサムネイルを作成しようとするなどの最適化を試しました。しかしそれは速度を大幅に改善しなかった。だから私の質問は次のとおりです:イメージファイルバッファをメモリに置いて、サムネイルを作成する最も簡単な方法は何ですか?

イメージファイルバッファをメモリに保存すると(例えば、埋め込まれたサムネイルなしで圧縮された24ビットJPEG)、そこからサムネイルイメージを直接作成する方法はありますか?この場合、サムネイルを作成するための最速の方法として何をお勧めしますか?

答えて

7

JPEG画像の場合、ほとんどのDCTデータを破棄し、DCT係数のみを使用して2倍のサイズのサムネイルを作成することができます。

ソースが見つかる場合は、EnlightenmentプロジェクトのEPEGをご覧ください。 JPEGファイルで探しているものとまったく同じように、画像のデコードや解凍はまったくありません。ソースコードは非常に参考になります。

その他の画像形式の場合は、それほど単純ではありません。画像をメモリバッファにデコードしてレンダリングしてから、独自のスケーリングを実行する必要があります。 CImgとboost :: GILライブラリはこれを支援することができます。

+0

ありがとう、それは私が欲しかったと思われる。 –

+1

私はEPEGをテストすることができました。同じことに興味がある人は、EPEGライブラリが啓発のソースコードから削除されたと言わざるを得ないので、古いソースコードの中でそれを探してください。 http://download.enlightenment.org/snapshots/2008-01-25/ –

+0

TIFF画像の場合は、次のコードを使用しました。http://www.koders.com/c/fidFAE1882A0596B9D224D831B852AE9891D0154D6D.aspx これはEPEGほど高速ではありませんが、作業が完了します。 –

3

最初に画像を取得するよりも、画像をサムネイルに変換するのに時間がかかりますが、正しいと思いますか?

より速いサムネイル変換プログラムが問題を解決するかもしれませんが、コンピュータの速度が遅い人には不十分です。代わりに、サムネイルに変換するイメージのキューを作成することをお勧めします。つまり、スキャンしたイメージをキューに追加するスレッド(またはプロセス)と、そのキューからイメージを削除し、サムネイルを作成するスレッド/プロセスです。このようにして、2つの操作の相対速度は関係ありません。

+0

回答ありがとうございました 私はすでにこの方法を試していますが、パフォーマンスは大幅に向上しますが、まだ十分に速くはありません。 私は正しく行っているかどうかはわかりませんが、C#コードにApplication.DoEvents()コールを追加してサムネイルビューアコントロール(他のスレッドで作成されたサムネイルで塗りつぶしたもの)を無効にし、プロセス全体を5枚以上の用紙をスキャンした後、スキャナが一瞬待つ(1秒未満)。デバイスに同梱されている商用アプリケーション(速度を複製し、必要な機能を追加しようとしている)と比較すると、それほど高速ではありません。 –

+0

残念ながら、私はC#(またはTWAINについてはそれほど馴染みがありません)に慣れていませんが、キューイングの結果がスキャナをどのように遅くするか理解できません。私はあなたがサムネイル変換スレッド/プロセスの優先度を取得スレッド/プロセスの優先度以下に設定したと仮定します。これが考えられる原因の1つです。 –

+0

ありがとう、もう一度、 私はそれについてはわからない、それはメインスレッド以外のC#スレッドは常にメインスレッドよりも低い優先順位を持っているようだ。しかし、次の答え(greyfade)は、私が必要とするより機能的な解決策であるようです。 –

関連する問題