也许我需要一个计时器?
我希望在图像保存之前或保存之后,但显示图像一个接一个。现在它只是做循环,所以它不会显示设计师在所有,直到循环将结束。
using Accord.Video.FFMPEG;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Net.Mime.MediaTypeNames;
namespace Extract_Frames
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
backgroundWorker1.RunWorkerAsync();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
using (var vFReader = new VideoFileReader())
{
vFReader.Open(@"C:\Users\Chocolade 1972\Downloads\MyVid.mp4");
for (int i = 0; i < vFReader.FrameCount; i++)
{
Bitmap bmpBaseOriginal = vFReader.ReadVideoFrame();
//bmpBaseOriginal.Save(@"d:\frames\frame" + i + ".bmp");
pictureBox1.Image = bmpBaseOriginal;
//bmpBaseOriginal.Dispose();
}
vFReader.Close();
}
}
}
}
它工作了一段时间,但在一些图像之后,它在行上抛出异常:
pictureBox1.Image = bmpBaseOriginal;
异常表明对象正在使用中。
系统操作无效异常:'对象目前正在使用中
1条答案
按热度按时间kb5ga3dv1#
您的程式码可能应该是这样:
所有的
Images
都被添加到队列中,然后一个接一个地出列。第一个Images
在加载完成后立即显示,其余的Images
将定期显示。此代码将每个Image
显示一次,然后销毁并丢弃它。如果要在到达最后一个集合时再次显示所有集合,则可以使用不同类型的集合,并在到达结束。编辑:
我可能有点误解了你的要求。这段代码应该在生成
Images
时显示它们:你可以放弃
Timer
和Queue
,我唯一担心的是这可能会导致OutOfMemoryException
,如果是这样,你可以间歇地显式调用GC.Collect
,比如每100帧调用一次。