2

編集:

すみません、私の質問があいまいだったと思います。画像全体の読み込みに時間を浪費することなく、ファイルが画像ではないかどうかを確認する方法が必要です。そうすれば、残りの読み込みを後で行うことができます。ファイル拡張子だけをチェックしたくありません。

アプリケーションは画像を表示するだけです。「有効性を確認する」とは、ディレクトリ内の「画像以外のファイルを検出してスキップする」ことを意味しました。ピクセル データが破損している場合でも、画像として扱いたいと思います。

ページ番号を割り当てて、これらの画像をペアにします。一部の画像は、単一の左ページまたは右ページです。一部の画像は幅が広く、左右のページの「見開き」です。たとえば、pagesAt(3) と pagesAt(4) は、同じ std::pair 画像または同じ幅の広い画像の std::pair を返す可能性があります。

場合によっては、奇数の「薄い」画像があり、最初の画像がワイド画像と同様に単独で表示されることがあります。例として、単一の表紙があります。

ディレクトリ内のどのファイルが画像ではないかわからないということは、それらのページ番号を自信を持って割り当てて、表示するファイルをペアにすることができないことを意味します。また、ユーザーがページ X にジャンプすることを決定した場合、後で画像以外のファイルを見つけて削除し、それに応じてページ番号を再割り当てすると、ページ X が別の画像に見える可能性があります。

オリジナル:

念のため、Qt ライブラリの c++ と QImage を使用しています。

ディレクトリを反復処理し、画像へのパスで QImage コンストラクターを使用しています。もちろん、これは非常に遅く、アプリケーションが応答しないように感じさせます。ただし、無効な画像ファイルを早期に検出して無視することはできます。

ディレクトリを通過しているときに画像へのパスのみを保存し、実際に必要なときにのみそれらをロードすることはできますが、画像が無効かどうかはわかりません。

この2つを組み合わせて考えています。つまり、ディレクトリを反復処理しながら、画像のヘッダーのみを読み取って有効性を確認し、必要に応じて画像データをロードします。

そう、

画像ヘッダーだけを読み込むと、画像全体を読み込むよりもはるかに高速になりますか? または、ヘッダーを読み取るために少し i/o を行っているということは、画像の完全な読み込みを終了することを意味しますか? 後で、アーカイブからの画像も解凍するので、これはヘッダーだけの解凍とファイル全体の解凍にも当てはまります。

また、画像ヘッダーだけをロード/読み取る方法がわかりません。画像のヘッダーだけを読めるライブラリはありますか? そうしないと、各ファイルをストリームとして開き、すべてのファイル タイプのイメージ ヘッダー リーダーを自分でコーディングする必要があります。

4

5 に答える 5

4

Unixfileツール (ほとんどずっと前から存在している) は、まさにこれを行います。これは、既知のファイル ヘッダーとバイナリ シグネチャのデータベースを使用してファイルの種類を特定する (そしていくつかの簡単な情報を抽出する可能性がある) シンプルなツールです。

データベースは単純なテキスト ファイル (効率のためにコンパイルされます) であり、単純な構造化形式 ( に記載) を使用して多数のバイナリ ファイル形式を記述しますman magic。ソースは/usr/share/file/magic(Ubuntu)にあります。たとえば、PNG ファイル形式のエントリは次のようになります。

0       string          \x89PNG\x0d\x0a\x1a\x0a         PNG image
!:mime  image/png
>16     belong          x               \b, %ld x
>20     belong          x               %ld,
>24     byte            x               %d-bit
>25     byte            0               grayscale,
>25     byte            2               \b/color RGB,
>25     byte            3               colormap,
>25     byte            4               gray+alpha,
>25     byte            6               \b/color RGBA,
>28     byte            0               non-interlaced
>28     byte            1               interlaced

画像ファイルの種類だけの署名を抽出し、独自の「スニファー」を構築するか、fileツールからパーサーを使用することもできます (BSD ライセンスのようです)。

于 2009-12-30T23:25:53.223 に答える
3

私の2セントを追加するだけです.QImageReaderを使用して、実際にファイルをロードせずに画像ファイルに関する情報を取得できます.

たとえば、.format メソッドを使用すると、ファイルの画像形式を確認できます。

公式の Qt ドキュメント ( http://qt-project.org/doc/qt-4.8/qimagereader.html#format ) から:

画像の読み取りに QImageReader が使用する形式を返します。デバイスをリーダーに割り当てた後にこの関数を呼び出して、デバイスのフォーマットを判別できます。例: QImageReader reader("image.png"); // reader.format() == "png" リーダーがデバイスから画像を読み取ることができない場合 (たとえば、そこに画像がない、または画像が既に読み取られている)、または形式がサポートされていない場合、この関数は戻ります。空の QByteArray()。

于 2012-05-12T15:17:46.767 に答える
0

ローカルファイルシステムでファイルのヘッダーを開いて読み取るのにそれほど費用がかかることはありませんが、ファイルがリモート(ネットワーク)ファイルシステムにある場合は費用がかかる可能性があります。さらに悪いことに、階層ストレージ管理で保存されたファイルにアクセスしている場合、ファイルの読み取りには非常にコストがかかる可能性があります。

このアプリがあなただけのものである場合、あなたはそれらの問題について心配しないことを決めることができます。ただし、アプリを一般に配布する場合は、絶対に必要になる前にファイルを読み取ると、一部のユーザーに問題が発生します。

Raymond Chenは、彼のブログThe OldNewThingにこれに関する記事を書きました。

于 2009-12-30T22:57:10.367 に答える
0

ヘッダーをロードするだけの答えはわかりません。ロードしようとしている画像の種類に依存する可能性があります。可能であれば、Qt::Concurrent を使用して画像を調べ、残りのプログラムを続行できるようにすることを検討してください。この場合、最初はすべてのエントリを不明な状態として表示し、検証が完了したらイメージまたは非イメージに変更します。

于 2009-12-30T19:17:08.613 に答える
0

特定の形式だけでなく、一般的な画像ファイルについて話している場合は、画像ヘッダーが有効であるが、画像データが有効でない場合があることは間違いありません。アプリケーションについて何も言わなかったのですが、バックグラウンドでスレッドを追加して、RAM にいくつかの画像を保持し、ユーザーが次にロードするものに応じてそれらを交換する方法はありませんか? IE: スライド ショー アプリは、現在の画像の前後に 1 つまたは 2 つの画像を読み込みます。または、バックグラウンド スレッドがデータの有効性を確認できるまで、イメージ名の横に疑問符を表示することもできます。

于 2009-12-30T21:39:13.223 に答える