我第一次使用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");
}
所有帧都被最后一帧替换。
现在我知道在列表中添加一个引用而不是复制,但是我检查的所有建议都说通过为每个元素创建一个新的对象实例会使它引用每个不同的一个。所以我不知道我做错了什么,也许我错过了什么?
答案 0 :(得分:0)
我想知道,每个帧的图像数据是否更新或覆盖了curr_frame?如果您只是更新它,那么Bitmap的所有实例都可能指向相同的图像数据实例...保存时没有问题,因为图像数据始终是您要保存的帧,但是当您引用时再次反对它们都会指向相同的图像数据。
答案 1 :(得分:0)
尝试在将位图添加到列表时克隆位图:prevFrames.Add(_curr_frame.Clone());