2017-02-04 551 views
1

我想播放PictureBox中的一个小视频。我的桌面上有一个包含151个带有.png扩展名的帧的文件夹。这是我已经尝试过:c# - 试图在一个picturebox中播放视频

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

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

这并不工作,因为有一个错误,指出:

无法隐式转换类型System.IO.FileInfoSystem.Drawing.Image

我不知道如何将FileInfo设置为Image。 (顺便说一句代码壁炉文件夹是包含帧的文件夹。)

+0

使用[Image.FromFile](https://msdn.microsoft.com/en-us/library/system.drawing.image.fromfile(v = vs.110).aspx) –

+0

也可以添加一个'System.Windows.Forms.Timer'后面的图像将切换。 – BladeMight

+0

John Wu,你能展示示例代码吗?我是这样一个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++; 
    }