おかげヤール
あなたが正しいと私は、新しいインスタンスを作成するときに、フレームが正しく保存されています。 しかし、私のコードはMicrosoftの例に基づいていました。問題は、writablebitmapが使い捨てではないため、新しいインスタンスを作成するとメモリリークが発生することです。
同様の問題は、フレームが最初のフレームにfrizzedれる次のリンクで説明され、これはwriteablebitmapの固有の特性である。したがって
http://www.wintellect.com/devcenter/jprosise/silverlight-s-big-image-problem-and-what-you-can-do-about-it
iが上記の溶液に類似の戦略を使用元のビットマップフレームの代わりにコピーを取得しようとします。このシナリオでは、初期化ステップでColorFrames_Array []の各要素のための新しいwriteblebitmapを作成しました。
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'を作成していないため、すべての要素が1つのオブジェクトを参照するためです。 – Yar