Hamizah AHMAD TALHAH Ответов: 3

Скорость получения изображения в элемент управления PictureBox


В настоящее время я работаю над приложением windows form, которое позволяет пользователю извлекать изображение после поиска в текстовом поле. Проблема в том, что изображение загружается очень медленно. Как я могу преодолеть эту проблему, чтобы ускорить загрузку? Если у кого-то есть предложения по более быстрому способу получения этих изображений, мы будем очень признательны. Вот мой код:

Что я уже пробовал:

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");
   }

3 Ответов

Рейтинг:
2

Dave Kreskowiak

Возможно, вам захочется выяснить, как использовать отладчик, чтобы вы могли следить за тем, что на самом деле делает ваш код.

Вы не загружаете ни одного изображения. Ваш код загружается в PictureBox (который может отображать только одно изображение за раз), каждое изображение в папке и все поддерево под этой папкой, по одному за раз.

На самом деле нет никакого способа ускорить это, потому что GetFiles ищет корневую папку, а затем ищет все поддерево этой папки, создавая список файлов "*.jpg". Это может быть трудоемким процессом, особенно на сетевом ресурсе, как вы делаете.

Как только это будет сделано, вы пройдете по каждому из этих возвращенных путей к файлам и попросите PictureBox (который может отображать только одно изображение за раз) загрузить его, а затем забыть о каждом из этих файлов. Будет отображаться только последний путь к файлу в списке, возвращаемом GetFiles.

Я понятия не имею, что вы на самом деле пытаетесь сделать с этим кодом.

О, и это тоже утечка ресурсов, как сумасшедшая. Вы должны избавиться от каждого созданного Вами растрового объекта, но вы этого не делаете.


Richard Deeming

- Ваш код загружается ... каждое изображение в папке и все поддерево под этой папкой, по одному."

Э - э-э, конечно, безусловное break; заявление в конце foreach петля предотвратит это? :)

Dave Kreskowiak

Возгласы. Пропустил заявление о перерыве.

Рейтинг:
1

Richard Deeming

То DirectoryInfo.GetFiles метод находит все соответствующие файлы и загружает их в массив, прежде чем вернуть управление вашему коду. Затем ваш код считывает первый соответствующий файл и игнорирует остальные.

Попробуйте использовать EnumerateFiles вместо этого; это возвращает каждый файл по мере его нахождения, не дожидаясь завершения поиска:

bool fileFound = false;
DirectoryInfo di = new DirectoryInfo(baseFolder);
foreach (var file in di.EnumerateFiles(imgName, SearchOption.AllDirectories))
{
    pictureBox1.Visible = true;
    pictureBox1.Image = Image.FromFile(file.FullName);
    fileFound = true;
    break;
}
if (!fileFound)
{
    ...
}

Вы даже можете использовать LINQ, чтобы упростить это:
DirectoryInfo di = new DirectoryInfo(baseFolder);
FileInfo file = di.EnumerateFiles(imgName, SearchOption.AllDirectories).FirstOrDefault();
if (file != null)
{
    pictureBox1.Visible = true;
    pictureBox1.Image = Image.FromFile(file.FullName);
}
else
{
    ...
}


Рейтинг:
1

Hamizah AHMAD TALHAH

Я уже пробую, но все еще медленно. :(


Richard Deeming

Но вы, очевидно, решили проблему.

Откуда мне знать? Потому что вы разместили это как "решение", а затем приняли его, отметив свою проблему как"решенную".

Удалите это фальшивое "решение".

Hamizah AHMAD TALHAH

Извиняюсь. Может быть, я случайно нажал на нее.