2009-05-03 46 views
2

我試圖使用字節數組使用下面的代碼動態創建一個位圖圖像位圖創作C#:使用字節數組

Bitmap GetImage() 
{ 
    IntPtr ip = Marshal.AllocCoTaskMem(imagesize); 

    //some code to fill ip 

    Image img = new Bitmap(
        w, 
        h, 
        -stride, 
        PixelFormat.Format24bppRgb, 
        (IntPtr)(ip.ToInt32() + imagesize - stride) 
        ); 

    Marshal.FreeCoTaskMem(ip); // Comment this line to work 

    return img; 
} 

void SaveImage() 
{ 
    Image img = GetImage(); 
    img.save("test.bmp"); // This call fails 
    img.Dispose(); 
} 

現在我的問題是我想回到一個位圖,但在同一時間我不t想要保持ip指針的內存分配泄漏。它永遠不會被釋放。 如何返回使用字節數組創建的圖像,並且不會打擾函數GetImage()的調用方來釋放內存。

回答

4

最簡單的方法可能是創建位圖(雖然在similar code我使用一個正常byte[]然後fixed塊,而不是直接使用AllocCoTaskMem),然後創建相同大小的Bitmap。在第二個位圖上調用Graphics.FromImage,然後Graphics.DrawImage使用第一個位圖將第一個位圖的內容有效地複製到第二個位圖上。然後您可以在第一個位圖上調用Dispose,釋放內存,並使用基本上爲副本的第二個位圖。

有可能是,如果你有像的東西更熟練做更有效的方式,但如果你只是在尋找一種方式來獲得它的工作,這是一個出發點:)

編輯:

using (Bitmap original = new Bitmap(...)) 
{ 
    Bitmap copy = new Bitmap(originalImage); 
    // Then return "copy" from your method, and you can free the 
    // memory 
} 
+0

我正在從非託管緩衝區,只不過是DirectX的SampleGrabber過濾器中的數據,這是我現在用AllocCoTaskMem – Ankit 2009-05-03 20:26:44

0

如果你事先知道尺寸,爲什麼不創建位圖,並使用Bitmap.LockBits方法來獲得所述輸入緩衝器地址:zachrrs的評論也更容易使用Bitmap(Image)構造確實使事情?