2013-05-07 3 views
0

저는 C#의 새로운 기능입니다.한 번만 개체 만들기 및 업데이트

 public static BitmapSource FromNativePointer(IntPtr pData, int w, int h, int ch) 
     { 
      System.Windows.Media.PixelFormat format = System.Windows.Media.PixelFormats.Default; 

      if (ch == 1) format = System.Windows.Media.PixelFormats.Gray8; //grey scale image 0-255 
      if (ch == 3) format = System.Windows.Media.PixelFormats.Bgr24; //RGB 
      if (ch == 4) format = System.Windows.Media.PixelFormats.Bgr32; //RGB + alpha 

      WriteableBitmap wbm = new WriteableBitmap(w, h, (double)96, (double)96, format, null); 

      CopyMemory(wbm.BackBuffer, pData, (uint)(w * h * ch)); 

      wbm.Lock(); 
      wbm.AddDirtyRect(new Int32Rect(0, 0, wbm.PixelWidth, wbm.PixelHeight)); 
      wbm.Unlock(); 

      return wbm; 
     } 

나는 WBM 변수로 약간의 메모리 문제에 봉착 :

나는이 코드를 가지고있다. 이 함수 외부에서 변수를 만든 다음 함수에 들어갈 때만 매개 변수를 업데이트하려면 어떻게해야합니까? 감사합니다.

+1

갖고있는 메모리 문제에 대해 더 자세히 설명해 줄 수 있습니까? –

+0

'새로운 WriteableBitmap (...)을 피하려면'MAX_WIDTH'와'MAX_HEIGHT'를 사용하여'Bitmap'과'BitmapData'를 사용하여 직접 구현해야합니다. 그런 다음 필드로 저장하고 필요할 때마다 다시 사용할 수 있습니다. 이것은 스레드로부터 안전하지 않습니다. – SimpleVar

+0

감사합니다. @YoryeNathan 시도해 보겠습니다. – Probst

답변

0

메서드에 추가 매개 변수로 wbm을 전달하기 만하면됩니다.

public static void 
    FromNativePointer(ref BitmapSource wbm, IntPtr pData, int w, int h, int ch) 

이 방법을 선언하는 경우, 당신은 또한 ref를 사용하여 호출해야합니다 :

FromNativePointer(ref mywbm, mypData ... etc. 
+0

'w'와 'h'에 따라 필요할 때마다 어떻게 변경됩니까? – SimpleVar

+0

무엇? 그는 이미 그 코드를 작성했습니다. 분명히, 새로운'BitmapSource'가 필요하다면,'새로운'BitmapSource가 만들어 져야 할 것입니다. –

+0

이 함수를 사용할 때마다 새로운 wbm 변수를 생성하고 싶지 않습니다. 나는 그것을 단지 갱신하고 싶다. 그러나 w, h 및 형식을 요구할 것이기 때문에 함수 밖에서'WriteableBitmap wbm = new WriteableBitmap (w, h, (double) 96, (double) 96, format, null);과 같은 것을 만들지 않습니다. – Probst

1

당신이 ref로 매개 변수 목록을 선언하는 경우 당신은 return에없는 전역/정적 변수로 만들 수도 있습니다.

public class Example(){ 
     public static WriteableBitmap wbm; 
     . 
     . 
}