2013-05-07 146 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

您能更具體地瞭解您遇到的內存問題嗎? – 2013-05-07 22:12:15

+0

如果你想避免使用'new WriteableBitmap(...)',你將不得不使用'Bitmap'和'BitmapData'來實現它,它有一些'MAX_WIDTH'和'MAX_HEIGHT'。然後,您可以將其保存爲字段,並在您每次需要時重新使用它。請注意,這不是線程安全的。 – SimpleVar 2013-05-07 23:24:49

+0

謝謝@YoryeNathan我會試試 – Probst 2013-05-08 01:44:37

回答

0

只需將wbm作爲該方法的附加參數。你甚至不用到return,如果你在你的參數列表聲明爲ref

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 2013-05-07 22:20:58

+0

什麼?他已經編寫了這樣的代碼。顯然,如果需要新的'BitmapSource',則必須創建'new'' BitmapSource'。 – 2013-05-07 22:21:43

+0

我不想每次進入這個函數都要創建一個新的wbm變量。我想更新它。但我不能像這樣創建'WriteableBitmap wbm = new WriteableBitmap(w,h,(double)96,(double)96,format,null);'函數之外,因爲它會要求w,h和格式 – Probst 2013-05-07 22:35:58

1

你也可以把它變成一個全局/靜態變量。

public class Example(){ 
     public static WriteableBitmap wbm; 
     . 
     . 
} 
相關問題