2010-11-20 41 views
1

我有一個功能,需要一個顏色位圖,並使其灰度,但內存使用率太高。我之前使用過Marshal.Copy方法,沒有內存泄漏,但速度較慢。任何幫助?使用指針時內存使用量過多?

 Bitmap b = a.Clone(new Rectangle(0, 0, a.Width, a.Height), a.PixelFormat); 
     BitmapData bData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, b.PixelFormat); 
     byte bitsPerPixel = Convert.ToByte(Image.GetPixelFormatSize(bData.PixelFormat)); 

     /*This time we convert the IntPtr to a ptr*/ 
     byte* scan0 = (byte*)bData.Scan0.ToPointer(); 

     //Console.WriteLine(scan0); 
     for (int i = 0; i < bData.Height; ++i) 
     { 
      for (int j = 0; j < bData.Width; ++j) 
      { 
       byte* data = scan0 + i * bData.Stride + j * bitsPerPixel/8; 

       data[0] = data[1] = data[2] = (byte)((data[0] + data[1] + data[2])/3); 

      } 
     } 
     b.UnlockBits(bData); 
     bData = null; 
     return b; 
+0

如何測量內存使用情況? – 2010-11-20 09:46:41

+0

與任務管理器,不是最好的方式,但它確實表明內存沒有被釋放。 – Jon 2010-12-16 06:30:43

回答

1

我不知道內存泄漏,但有一個更好的方法來將圖像轉換爲灰度。訪問這個page,你會發現三種方式來做到這一點,第三種方式稱爲「短而甜」是最快的。最甜蜜的。

即使在谷歌和互聯網存檔的回程機器中,外部網站也不可用,但另一個SO answer中給出了短而甜的方法代碼。

+0

+1用於GDI +色彩矩陣的很好的應用程序。 – 2010-11-20 09:48:08

+0

謝謝。我會考慮這樣做。 – Jon 2010-12-16 06:32:47

0

如果要直接從C#中寫入內存指針,則需要使用「不安全的代碼」。請參閱此處的文章以獲取更多信息:

http://msdn.microsoft.com/en-us/library/aa288474(VS.71).aspx

+0

你的意思是檢查「使用不安全的代碼」並指定「不安全」,是的,我做到了 – Jon 2010-12-16 06:32:23