0

我想选择图片(它们是在程序运行期间选择的)并将它们显示在表单上。为此,我在表单上使用了一个面板并用图片框填充面板。我为此编写了以下代码,但这非常耗时:

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 回答