2017-02-04 17 views
1

Я хочу воспроизвести небольшое видео в формате PictureBox. У меня есть папка на моем рабочем столе, содержащая 151 фрейм с расширением .png. Это то, что я уже пробовал:C# - пытается воспроизвести видео в картинке

System.IO.DirectoryInfo di = new DirectoryInfo("c:\\Users\\" + Environment.UserName + "\\Desktop\\fireplace"); 

foreach (FileInfo file in di.GetFiles()) 
{ 
    pictureBox1.Image = file; 
} 

Это не работает, потому что это ошибка, которая говорит:

Не может неявно преобразовать тип System.IO.FileInfo в System.Drawing.Image

Я не умеют делать FileInfo до Image. (. Кстати папка камин в коде есть папка, которая содержит кадры.)

+0

Используйте [Image.FromFile] (https://msdn.microsoft.com/en-us/library/system.drawing.image.fromfile (v = vs.110) .aspx) –

+0

Также вы можете добавить a 'System.Windows.Forms.Timer', после которого будут переключаться изображения. – BladeMight

+0

John Wu, вы можете показать пример кода? Im такой noob, я не знаю, как его использовать> _ < – diPokiI

ответ

1

Мое предложение было бы загрузить все изображения в один List<Bitmap>, а затем использовать Timer менять картинки внутри PictureBox:

List<Bitmap> _images = new List<Bitmap>(); 
int _currentImageIndex = 0; 

int CurrentImageIndex 
{ 
    get { return _currentImageIndex; } 
    set { 
     _currentImageIndex = value; 
     if (InvokeRequired) 
     { 
      Invoke(new MethodInvoker(() => { _pictureBox.Image = _images[_currentImageIndex]; }); 
     } 
     else 
     { 
      _pictureBox.Image = _images[_currentImageIndex]; 
     } 
    } 
} 

Bitmap LoadImage(Stream stream) 
{ 
    return new Bitmap(stream, false); 
} 

public void LoadImages(DirectoryInfo dInfo) 
{ 
    foreach(FileInfo fInfo in dInfo.GetFiles()) 
    { 
     if(InvokeRequired) 
     { 
      Invoke(new MethodInvoker(() => { _images.Add(LoadImage (fInfo.Open(FileMode.Open))); }); 
     } 
     else 
     { 
      _images.Add(LoadImage (fInfo.Open())); 
     } 
    } 
} 

void WhenTimerTicks(object sender, EventArgs e) 
{ 
    if(CurrentImageIndex < _images.Count) 
     CurrentImageIndex++; 
} 

Теперь все, что вам нужно сделать, это читать файлы и после этого установить таймер:

LoadImages(new DirectoryInfo("c:\\Users\\" + Environment.UserName + "\\Desktop\\fireplace")); 

Timer t = new Timer(); 
t.Interval = 1000/25; // 25 FPS 
t.Tick += WhenTimerTicks; 
t.Start(); 
+0

Вы избили меня на 5 минут. – BladeMight

+0

@BladeMight Вы всегда можете задать свое предложение, если оно отличается, и, возможно, кто-то еще найдет его более полезным, а затем моим :) –

+0

@ m.rogalski Nah, его почти то же самое:] – BladeMight

0

m.rogalski:

List<Bitmap> _images = new List<Bitmap>(); 
    int _currentImageIndex = 0; 

    int CurrentImageIndex 
    { 
     get { return _currentImageIndex; } 
     set 
     { 
      _currentImageIndex = value; 
      if (InvokeRequired) 
      { 
       Invoke(new MethodInvoker(() => { pictureBox1.Image = _images[_currentImageIndex]; }); 
      } 
      else 
      { 
       pictureBox1.Image = _images[_currentImageIndex]; 
      } 
     } 
    } 

    Bitmap LoadImage(Stream stream) 
    { 
     return new Bitmap(stream, false); 
    } 

    public void LoadImages(DirectoryInfo dInfo) 
    { 
     foreach (FileInfo fInfo in dInfo.GetFiles()) 
     { 
      if (InvokeRequired) 
      { 
       Invoke(new MethodInvoker(() => { _images.Add(fInfo.Open(FileMode.Open)); })); //Argument 1: cannot convert from 'System.IO.FileStream' to 'System.Drawing.Bitmap' 
      } 
      else 
      { 
       _images.Add(fInfo.Open(FileMode.Open)); //Argument 1: cannot convert from 'System.IO.FileStream' to 'System.Drawing.Bitmap' 
      } 
     } 
    } 

    void WhenTimerTicks(object sender, EventArgs e) 
    { 
     if (CurrentImageIndex < _images.Count) 
      CurrentImageIndex++; 
    } 

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

  • Нет связанных вопросов^_^