感谢亚尔
你是正确的,当我创建一个新的实例,帧正确保存。 但我的代码是基于微软的例子,问题是创建新的实例会导致内存泄漏,因为writablebitmap不是一次性的。
类似的问题在下面的链接帧被frizzed到第一框架讨论,这是从WriteableBitmap的的固有性质:
http://www.wintellect.com/devcenter/jprosise/silverlight-s-big-image-problem-and-what-you-can-do-about-it
因此,我使用类似于上述溶液中的策略并尝试获取副本而不是原始位图帧。在这种情况下,我在初始化步骤中为ColorFrames_Array []的每个元素创建了一个新的可写位图。
ColorFrames_Array = new riteableBitmap[MaximumFramesNumbers_Capturing];
for (int i=0; i < MaximumFramesNumbers_Capturing; ++i)
{
ColorFrames_Array[i] = new WriteableBitmap(color_width, color_height, 96.0, 96.0, PixelFormats.Bgr32, null);
}
最后,使用克隆方法将位图帧复制到数组元素。
ColorFrames_ArrayBuffer[CapturingFrameCounter] = _ProcessingInstance.colorBitmap.Clone();
虽然上面的解决方案的作品,但它有一个巨大的内存泄漏!! 因此,我使用Arrayable和.copypixel方法(writeablebitmap)将帧的像素复制到数组并保存它(而相应的writeablebitmap将正确放置而没有泄漏)。
public Array[] ColorPixels_Array;
for (int i=0; i< MaximumFramesNumbers_Capturing; ++i)
{
ColorPixels_Array[i]=new int[color_Width * color_Height];
}
colorBitmap.CopyPixels(ColorPixels_Array[Counter_CapturingFrame], color_Width * 4, 0);
最后,当我们要保存的像素阵列,我们需要将它们转换新的WriteableBitmap的实例,并将它们写在硬盘。
wb = new WriteableBitmap(color_Width, color_Height, 96.0, 96.0, PixelFormats.Bgr32, null);
wb.WritePixels(new Int32Rect(0, 0, color_Width, color_Height)
, Ar_Px,
color_Width * 4, 0);
发生这种情况可能是因为您没有创建新的_ProcessingInstance,因此所有元素都引用一个对象。 – Yar