0

好吧,我是第一次使用 C#,并且出现了标题中的问题。它类似于 stackoverflow 中的其他问题,但是我正在使用他们的答案建议的修复程序,但仍然无法正常工作。

我想保存视频的前 50 帧,我正在这样做(_frame_nr 增量和循环不在此范围内,但它们与问题无关,因为该部分有效)

  if (_frame_nr < 50){
    Bitmap _curr_frame = new Bitmap(_width, _height, _stride, System.Drawing.Imaging.PixelFormat.Format24bppRgb, (IntPtr)curr_frame);
    _curr_frame.Save("C:\\curr_frame\\frame_nr_" + _frame_nr + ".png");
    prevFrames.Add(_curr_frame); }

此代码有效,因为前 50 个正确帧已保存在文件夹中。

但是紧接着我做这个循环

for (int y = 0; y < 50; y++)
{
    Bitmap _prev_frame = prevFrames[y];
    _prev_frame.Save("C:\\_prev_frame\\frame_nr_" + y + ".png");
}

所有的框架都被最后一个取代。

现在我知道在列表中添加引用而不是复制,但是我检查的所有建议都说,通过为每个元素创建一个内部对象的新实例将使其引用每个不同的元素。所以我不知道我做错了什么,也许我错过了什么?

4

2 回答 2

0

我想知道,curr_frame 是否被每帧的图像数据更新或覆盖?如果您刚刚更新它,那么位图的所有实例可能都指向同一个图像数据实例......保存时不是问题,因为图像数据将始终是您要保存的帧,但是当您引用稍后再次对象,它们都将指向相同的图像数据。

于 2013-11-11T12:27:43.477 回答
0

将位图添加到列表时尝试克隆位图:prevFrames.Add(_curr_frame.Clone());

于 2013-11-11T12:30:58.283 回答