加快将图像检索到图片框中

时间:2017-05-31 00:56:16

标签: c# visual-studio-2013 windows-forms-designer

我目前正在使用Windows窗体应用程序,它允许用户在文本框中搜索后检索图像。问题是图像加载速度很慢。如何克服此问题以加快加载?如果有人建议以更快的方式检索这些图像,我们将不胜感激。这是我的代码:

  string baseFolder = @"\\\\jun01\\hr\\photo";
  string imgName =  "*" + textBoxEmplNo.Text  + "*.jpg";

  //Bool to see if file is found after checking all
  bool fileFound = false;

  DirectoryInfo di = new DirectoryInfo(baseFolder);
  foreach (var file in di.GetFiles(imgName, SearchOption.AllDirectories))

   {
    pictureBox1.Visible = true;
    pictureBox1.Image = Image.FromFile(file.FullName);

    fileFound = true;
    break;
   }

    if (!fileFound)
   {
    pictureBox1.Visible = true;
    pictureBox1.Image = Image.FromFile(@"\\\\jun01\\hr\\photo\\No-image-
    found.jpg");
   }

2 个答案:

答案 0 :(得分:0)

这里很可能是您遇到的缓慢是由于对远程目录中所有文件的通配符搜索,和/或可能通过网络传输大文件以在PictureBox中显示。您应该使用分析器对这两个操作进行计时(例如参见https://www.simple-talk.com/dotnet/net-performance/the-why-and-how-of-net-profiling/),并考虑优化占用时间最多的操作。

某些可能性可能包括在用户进行选择或在后台线程下载之前预先下载所有图像,同时显示"请等待"用户界面上的消息。

答案 1 :(得分:0)

可能是这样的情况,代码的缓慢是由于所有文件的通配符搜索:(例如di.GetFiles需要太长时间)

  • 您的热门文件夹/子文件夹中的文件太多。

  • 网络连接太慢,无法获取文件信息或照片太大。 (远程目录访问速度可能很慢 - 您可以通过将一个大文件复制到远程目录并将其复制回您的PC来进行检查)

  • 照片可能会以不同的宽高比存储到您的照片框尺寸。 (如果需要调整大小,渲染需要一段时间)

对于初学者,让我们假设您的文件夹中有太多文件(1000s),然后我们需要按文件夹更智能地搜索第一个文件夹:

string baseFolder = @"\\\\jun01\\hr\\photo";
string imgName =  "*" + textBoxEmplNo.Text  + "*.jpg";

var file = FindFirstFile(baseFolder, imgName);
if (!string.IsNullorEmpty(file))
{
  pictureBox1.Visible = true;
  pictureBox1.Image = Image.FromFile(file);
}
else
{
 pictureBox1.Visible = true;
 pictureBox1.Image = Image.FromFile(@"\\\\jun01\\hr\\photo\\No-image-found.jpg");
}

其中FindFirstFile取自Markus's answer

public static string FindFirstFile(string path, string searchPattern)
{
    string[] files;

    try
    {
        // Exception could occur due to insufficient permission.
        files = Directory.GetFiles(path, searchPattern, SearchOption.TopDirectoryOnly);
    }
    catch (Exception)
    {
        return string.Empty;
    }

    if (files.Length > 0)
    {
        return files[0];
    }
    else
    {
        // Otherwise find all directories.
        string[] directories;

        try
        {
            // Exception could occur due to insufficient permission.
            directories = Directory.GetDirectories(path);
        }
        catch (Exception)
        {
            return string.Empty;
        }

        // Iterate through each directory and call the method recursivly.
        foreach (string directory in directories)
        {
            string file = FindFirstFile(directory, searchPattern);

            // If we found a file, return it (and break the recursion).
            if (file != string.Empty)
            {
                return file;
            }
        }
    }

    return string.Empty;
}