0

写真を選択して(プログラムの実行中に選択されます)、フォームに表示したいと思います。そのために、フォーム上のパネルを取り、そのパネルに pictureboxes.i を入力します。そのために次のコードを記述しますが、非常に時間がかかります。

if(openDialoge1.ShowDialog() == DialogResult.OK)
                {
                   string[] fileName = open.FileNames;
                   foreach (string s in fileName)
                   {
                        pBox = new PictureBox();
                        pBox.Size = new System.Drawing.Size(w, h);
                        pBox.Location = new System.Drawing.Point(x, y);
                        pBox.Image = Image.FromFile(s);
                        pBox.SizeMode = PictureBoxSizeMode.StretchImage;
                        .
                        .//here i add some eventHandler of picture boxes.

                        this.panel1.Controls.Add(pBox);
                        x += pBox.Width + 4;
                     }
                 } //here w,h,x,y are integers.

このコードはうまく機能しますが、非常に時間がかかり、パネルにピクチャ ボックスを表示するには多くの時間がかかります。たとえば、20,30枚の写真を選択すると、時間がかかります。パネルにピクチャボックスを設定する時間を短縮する方法はありますか?

前もって感謝します。

4

1 に答える 1

1

メソッドのプロファイリングを検討することもできます。ANTS のようなプロファイラーが利用できない場合は、独自のプロファイルを作成できます。

Stopwatch watch = new Stopwatch();
watch.Start();

//code to profile goes here

watch.Stop();
Console.Writeln("Elapsed time: " + watch.Elapsed.TotalMilliseconds + "ms");

これは、コードのどの部分が遅いかを特定するのに役立ちます。

Image.FromFile() がおそらく最も遅い部分であると言えます。別のスレッドまたはバックグラウンドワーカーを使用して、最初に画像を List<> にロードすることを検討してください。これにより、進行状況バーまたは砂時計を表示して、画像がディスクから読み取られていることをユーザーに知らせることができます。

画像がメモリに格納されると、ピクチャ ボックスの作成が大幅に高速化されます。

編集:

最初に画像をメモリにロードする方法を示す例をリクエストしました。それは本当に簡単です:

// this code should run in its own thread - BackgroundWorker is perfect for this

List<Image> images = new List<Image>();
foreach (string imagePath in paths)
{
   images.Add(Image.FromFile(imagePath));

   // update progress bar here?
}

これで、画像ボックスを埋めるために使用できる画像のリストができました。

于 2009-08-12T04:43:15.427 に答える