感謝亞爾
你是正確的,當我創建一個新的實例,幀正確保存。 但我的代碼是基於微軟的例子,問題是創建新的實例會導致內存泄漏,因爲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