2013-07-29 3 views
0

Я использую этот код для случайного отображения изображений из папки изображений в 3 ящиках изображений с некоторыми интервалами, но в ARandomNumber Я получаю System.drawing.Bitmap, и из-за этого я получаю FileNotFoundException, так как я адресности этого пути в pictureBox3.image C:\Users\Monika\Documents\Visual Studio 2010\Projects\OnlineExam\OnlineExam\Image\System.Drawing.Bitmap.pngОтображение изображений случайным образом из папки в нескольких ящиках изображений

Я не понимая, где я неправильно:

namespace StudentModule 
{ 
    public partial class Form1 : Form 
    { 
     Random r = new Random(); 
     int index = -1; 
     List<Image> images; 
     Image ARandomNumber; 
     Timer timer = new Timer(); 
     private int counter = 0; 
     public Form1() 
     { 
      InitializeComponent(); 
      timer1.Interval = 350; 
      timer1.Tick += new EventHandler(timer1_Tick); 

      List<Image> images = new List<Image>();//add images to this array 
      DirectoryInfo di = new DirectoryInfo(@"C:\Users\Monika\Documents\Visual Studio 2010\Projects\OnlineExam\OnlineExam\Image"); // give path 
      FileInfo[] finfos = di.GetFiles("*.jpg", SearchOption.TopDirectoryOnly); 
      foreach (FileInfo fi in finfos) 
       images.Add(Image.FromFile(fi.FullName)); 
      index++; 
      if (index < 0 || index >= images.Count) 
       index = 0; 
      timer.Start(); 
      pictureBox1.Visible = false; 
      pictureBox2.Visible = false; 
      pictureBox3.Visible = false; 
      pictureBox4.Visible = false; 


      int indx = r.Next(0, images.Count - 1); 

      ARandomNumber = images[index]; 
      images.RemoveAt(indx); 

      string path = @"C:\Users\Monika\Documents\Visual Studio 2010\Projects\OnlineExam\OnlineExam\Image\"; 
      pictureBox3.Image = Image.FromFile(path + ARandomNumber + ".png"); 
      indx = r.Next(0, images.Count - 1); 

      ARandomNumber = images[index]; 
      images.RemoveAt(index); 
      pictureBox4.Image = Image.FromFile(path + ARandomNumber + ".png"); 
      indx = r.Next(0, images.Count - 1); 
      ARandomNumber = images[index]; 
      images.RemoveAt(index); 
      pictureBox5.Image = Image.FromFile(path + ARandomNumber + ".png"); 
      //Console.WriteLine(ARandomNumber); 
      if (images.Count <= 1) 
      { 
       images.Clear(); 
       populateImag(); 
      } 
     } 
     public void timer1_Tick(object sender, EventArgs e)  
     { 
      counter++; 
      if (counter == 1) 
      //or whatever amount of time you want it to be invisible    
     { 
      pictureBox3.Visible = true; 

     } 
     if (counter == 2) 
     { 
      pictureBox4.Visible = true; 
     } 
     if (counter == 3) 
     { 
      pictureBox5.Visible = true; 
      timer.Stop(); 
      counter = 0; 
     }      
     } 
     public void populateImag() 
     { 
      List<Image> images = new List<Image>();//add images to this array 
      DirectoryInfo di = new DirectoryInfo(@"C:\Users\Monika\Documents\Visual Studio 2010\Projects\OnlineExam\OnlineExam\Image"); // give path 
      FileInfo[] finfos = di.GetFiles("*.jpg", SearchOption.TopDirectoryOnly); 
      foreach (FileInfo fi in finfos) 
       images.Add(Image.FromFile(fi.FullName)); 
     } 
    } 
} 

заранее благодарю за любую помощь.

+0

Куда исключено исключение? Вы уверены, что у вас есть это изображение на этом пути? – wudzik

+0

Исключение выбрано в этой строке 'pictureBox3.Image = Image.FromFile (path + ARandomNumber +" .png ");' поскольку я не получаю имя файла по адресу из-за этого C: \ Users \ Monika \ Documents \ Visual Studio 2010 \ Projects \ OnlineExam \ OnlineExam \ Image \ 'System.Drawing.Bitmap' .png – Durga

+0

Я считаю, что вы смешиваете' indx' и 'index' –

ответ

0

Добавить таймер в дизайнере, установить его интервал и подписаться на его отметку в дизайнере - это сделает ваш код более чистым. Далее - создать список изображений боксах, которые вы хотите использовать для показа случайных изображений:

public partial class Form1 : Form 
{ 
    Random random = new Random(); 
    List<string> filesToShow = new List<string>(); 
    List<PictureBox> pictureBoxes; 

    public Form1() 
    { 
     InitializeComponent(); 

     pictureBoxes = new List<PictureBox> { 
      pictureBox1, 
      pictureBox2, 
      pictureBox3 
     }; 

     ShowRandomImages(); 
     timer1.Start(); 
    } 
} 

Единственный метод вызывается из конструктора ShowRandomImages здесь его определение:

private void ShowRandomImages() 
{ 
    foreach (var pictureBox in pictureBoxes) 
    { 
     if (!filesToShow.Any()) 
      filesToShow = GetFilesToShow(); 

     int index = random.Next(0, filesToShow.Count); 
     string fileToShow = filesToShow[index]; 
     pictureBox.ImageLocation = fileToShow; 
     filesToShow.RemoveAt(index); 
    } 
} 

Этот метод назначения случайное изображение из место нахождения. Если нет файлов для отображения слева, список перегружается.Имейте в виду - если вам нужны только имена файлов, а затем использовать Directory вместо DirectoryInfo и FileInfo:

private List<string> GetFilesToShow() 
{ 
    string path = @"C:\some\folder"; 
    return Directory.GetFiles(path, "*.jpg", SearchOption.TopDirectoryOnly) 
        .ToList(); 
} 

Все, что вам нужно сделать - вызвать ShowRandomImages метод из обработчика событий тиков таймера.

+0

да, это сделало мой код более ясным. СПАСИБО СО МНОГО, но как я должен объявлять 'filesToShow', я получаю ошибку для этого – Durga

+0

@Durga извините, забыли добавить его в поля формы. Обновление –

+0

спасибо, что это сработало, но изображения меняются, когда я закрываю и снова открываю приложение, я задал интервал 5, почему они не меняются с использованием этого интервала? – Durga

2

ARandomNumber - это изображение, это не путь. Изображение - это ресурс, загруженный в память и не всегда привязанный к пути.

Это не будет работать, потому что ARandomNumber.ToString() не возвращает путь (я предлагаю использовать в виде строки, содержащей FilePath вместо ARandomNumber):

pictureBox3.Image = Image.FromFile(path + ARandomNumber + ".png"); 

Во-вторых, первая нагрузка все * .jpgs:

FileInfo[] finfos = di.GetFiles("*.jpg", SearchOption.TopDirectoryOnly); 

Затем вы загружаете изображение, которое имеет расширение * .png:

pictureBox3.Image = Image.FromFile(path + ARandomNumber + ".png"); 

Вы уверены, что в вашей папке есть изображение jpg и png с тем же именем?

Edit: Возможное решение будет загрузить путь к файлу в виде строки вместо загрузки изображений или (потому что у вас есть все ваши изображения в массиве), попробуйте следующее:

ARandomNumber = images[index]; //Here you take a random image from the array of images 
images.RemoveAt(indx); 

pictureBox3.Image = ARandomNumber; //Here you assign the image directly to the Image property in picturebox. You do not need to load it again from file. 
+0

, как я должен исправлять его, чтобы я мог его просматривать в окне изображения – Durga

+0

да это сработало Спасибо . – Durga

0

При выборе файлы изображений, которые вы выбираете «.jpg», и при загрузке вы добавляете расширение «.png» в этот файл. Я думаю, что это вызывает проблемы. Посмотрите на ошибку:

pictureBox3.image C: \ Users \ Monika \ Documents \ Visual Studio 2010 \ Projects \ OnlineExam \ OnlineExam \ Image \ System.Drawing.Bitmap.png

имя файла с 2 расширения. .Bitmap.png

+0

Этот файл имеет одно расширение .png. – wudzik

Смежные вопросы