0

ファイルシステムから 101 個のビットマップをロードする必要があります (プログラムの実行ごとに変更されるため、リソースとしてアプリに組み込むことはできません)。短時間のタイマー イベント (500ms を与える) に基づいて Windows フォーム アプリケーションのピクチャ ボックスに順次または取る)。

基本的にスロー アニメーションのように動作する必要がありますが、すべての画像が表示されることが重要です。

これを行うために C# で簡単なアプリケーションを大まかに作成しましたが、画像の読み込みと表示に 500 ミリ秒以上かかっているようで、一部の画像が表示されません。

これを回避する方法はありますか?101 個のピクチャボックスをプリロードまたは作成し、表示および非表示にしますか?

誰か提案はありますか?

4

5 に答える 5

2

何が一番時間がかかりますか?画像の読み込みまたは表示?表示が必要なときに各画像を読み込んでいますか?あなたのコードを見ることは本当に価値があるでしょう。

常に正確に101枚の画像になることが確実な場合は、それらすべてをSystem.Drawing.Bitmap 最初Tickの配列にロードしてから、のイベントが呼び出されるたびにインクリメントされるイテレータ変数を設定しますTimer。このTickイベントで、を使用して配列からPictureBoxに画像をロードしPictureBox.Image = myBitmapArray[iterator]ます。を使用してイテレータをインクリメントする++i%=101;と、OutOfBoundsエラーが発生せず、アニメーションがループします。

于 2010-10-19T13:28:04.090 に答える
1

Bitmapアニメーションを開始する前に、オブジェクトの配列を設定します。

于 2010-10-19T13:20:07.590 に答える
1

いくつかのオプション... 1 つを選択するか、それらを組み合わせます。

(1) ロックとカウンターを使用して、イベントが発生したときに次のイメージを順番にロードしていることを保証します。

(2) イベントでタイマーを無効にしTick、イメージを読み込んだ後に再度有効にします。その結果、最後の画像が描画されてから 500 ミリ秒後に画像が到着するため、画像の読み込みに 1 秒かかる場合、画像は t=1000ms、t=1500ms、t=3000ms などで描画されます。すべての画像が描画されます。画像間で 500 ミリ秒が経過することが保証されていますが、アニメーションが遅く見える場合があります。

(3) 上記を実行しますが、イベントの開始時間を追跡し、画像が描画された後、次のタイマー ティックを 500 - (Now - eventStart)... に設定します。これにより、画像の描画に 250 ミリ秒かかる場合、次のタイマーティックは 250 ミリ秒で起動します。Now - eventStart < 0 の場合、次のタイマー ティックがすぐに開始されます。アニメーションにかかる時間は最小限に抑えられますが、画像が数ミリ秒しか表示されずに点滅する可能性があります。

(4)PictureBox.LoadAsync()マルチスレッドを提供するために使用します...前のイベントが描画している間に、次のイベントが画像をロードすることができます。ただし、画像がすべて描画されることを保証する必要がある場合は、LoadAsync() を呼び出す前に待機Mutexするイベントでリリースするが必要です。LoadCompleted

(5) 画像の描画が Layout カテゴリに該当するかどうかはわかりませんが、呼び出しSuspendLayout()ResumeLayout()、画像をロードする前/後に試すことができます

(6) 画像の配列を使用し、カウンターをロックし、の.Imageプロパティを使用しPictureBoxて画像を事前にロードできるようにします。これは別の回答でも提案されたと思います

HTH、
ジェームズ

于 2010-10-19T17:17:50.933 に答える
0

具体的な答えはありませんが、最初に画像の読み込み、画像の表示、または両方のアクションに時間がかかりすぎているかどうかを判断することからアプローチします.

画像がローカルにあり、比較的適切なハードウェアを使用している場合、画像サイズがかなり大きい場合でも、画像の読み込みは比較的高速になると思います。私の最初の試みでは、次の画像が読み込まれる前にアプリケーションが画像の表示が完了するのを待つ必要がないように、スレッドからすべての画像を順番に読み込む必要があります。

画像の表示に時間がかかる場合 (私の非常に強力なワークステーションでも、大きな画像の場合はそれほど高速ではありません)、アプリケーションがすべてを表示する前に画像を拡大縮小することはできますか? あなたのアプリケーションはフル解像度の画像を扱う必要がありますか? 最近のメガピクセル カメラでは、サイズがモニターの解像度の 6 倍を簡単に超える可能性があるため、画像ファイルにすべてのデータが存在することを望んでいるとは思えません。

于 2010-10-19T13:22:37.650 に答える
0

懸念される可能性のあるもう1つのことは、画像のサイズです。すべてが 18 メガピクセルの画像である場合、かなりの時間がかかるか、かなりのスペースが必要になることがわかります。

実装方法に応じて、2ギガのRAMを使用したり、ディスクからの読み取りを待機したりしないように、最初にロードするときに表示領域のサイズにサイズを変更することをお勧めします。

于 2010-10-19T13:34:40.643 に答える