2012-04-12 20 views
2

Ich habe ein Problem mit dem CGBitmapcontext. Ich bekomme einen Fehler beim Erstellen des CGBitmapContext mit der Nachricht "ungültiges Handle"."Ungültiger Handle" Create CGBitmapContext

Hier ist mein Code:

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

Danke;

Antwort

6

Das liegt daran, dass Sie null an den ersten Parameter übergeben. Der CGBitmapContext dient zum direkten Zeichnen in einen Speicherpuffer. Der erste Parameter in allen Überlastungen des Konstruktors ist (Apfel docs):

Daten Ein Zeiger zu dem Ziel in dem Speicher, wo die Zeichnung wiedergegeben werden soll. Die Größe dieses Speicherblocks sollte mindestens (BytesPerRow * Höhe) Bytes betragen.

In MonoTouch erhalten wir zwei Überladungen, die ein Byte [] für die Bequemlichkeit akzeptieren. So sollten Sie es wie folgt verwenden:

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

Danke sehr mutch;) das für mich gearbeitet;) – Alex

+0

Danke, obwohl dieses Verhalten anders ist, als Apple Docs sagen: 'Daten ', wenn Non-NULL, zeigt auf einen Block des Speichers mindestens' BytesPerRow * Höhe' Bytes. Wenn "Daten" NULL ist, werden die Daten für den Kontext automatisch zugewiesen und freigegeben, wenn der Kontext freigegeben wird. – Hrissan

+0

Wichtiger Punkt! Ihre App wird zufällig abstürzen, wenn Sie zulassen, dass Ihr ctxBuffer als Garbage Collection erfasst wird, bevor Sie den Kontext nicht mehr verwenden! Ich hatte Kontextvariable auf Klassenebene, während CtxBuffer lokale Variable im Kontext zum Erstellen von Funktionen war. App stürzte ab, bis ich ctxBuffer auf Klassenebene verschoben habe. In acht nehmen! – Hrissan

0

Dies kann auch passieren, wenn die width oder height übergebenen Parameter in die Methode einen Wert von 0 haben