2012-04-12 54 views
2

我遇到了CGBitmapcontext的問題。 我在創建帶有「無效句柄」消息的CGBitmapContext時出現en錯誤。「Invalid Handle」Create CGBitmapContext

這裏是我的代碼:

var previewContext = new CGBitmapContext(null, (int)ExportedImage.Size.Width, (int)ExportedImage.Size.Height, 8, (int)ExportedImage.Size.Height * 4,             CGColorSpace.CreateDeviceRGB(), CGImageAlphaInfo.PremultipliedFirst); 

謝謝;

回答

6

這是因爲您將null傳遞給第一個參數。 CGBitmapContext用於直接繪製到內存緩衝區中。在構造的所有的重載第一個參數是(蘋果文檔):

數據 一個指針,指向存儲器中的目的地,其中該圖是要被渲染。此內存塊的大小應至少爲 (bytesPerRow * height)個字節。

在MonoTouch中,爲了方便起見,我們得到兩個接受字節[]的重載。所以,你應該用這樣的:

int bytesPerRow = (int)ExportedImage.Size.Width * 4; // note that bytes per row should 
    //be based on width, not height. 
byte[] ctxBuffer = new byte[bytesPerRow * (int)ExportedImage.Size.Height]; 
var previewContext = 
    new CGBitmapContext(ctxBuffer, (int)ExportedImage.Size.Width, 
    (int)ExportedImage.Size.Height, 8, bytesPerRow, colorSpace, bitmapFlags); 
+0

值謝謝非常mutch;)這個工作對我來說) – Alex 2012-04-13 06:21:43

+0

謝謝,雖然這種行爲是不同的蘋果文檔說:'數據',如果非NULL,指向內存塊至少'bytesPerRow *高度'字節 。如果'data'爲NULL,則上下文數據 將自動分配,並在上下文取消分配 時釋放。 – Hrissan 2013-06-09 19:15:14

+0

重要的一點!如果您在停止使用上下文之前允許您的ctxBuffer被垃圾收集,您的應用程序將隨機崩潰!我在類級別上有上下文變量,而ctxBuffer在函數創建上下文中是局部變量。應用程序崩潰,直到我將ctxBuffer移動到類級別。謹防! – Hrissan 2013-06-09 20:39:54

0

這也有可能發生,如果widthheight參數傳遞到方法都爲0