MonoTouch – CGImage from Puntero bloquea la aplicación – iPhone

Tengo un método que utilizo para crear un único bitmap grande que luego populé con imágenes de mosaico más pequeñas:

private CGBitmapContext ExtractWriteableBitmap( RGBPaletteRecord rgbPalette, double dpi, ChartIndexFile indexFile, RasterChartFile chartFile ) { //CGBitmapContext bitmapImage = null; TileRecord tile; // calc the number of tiles in each plane int tileCountX = indexFile.TileIndexRecords.Max(ti => ti.X); int tileCountY = indexFile.TileIndexRecords.Max(ti => ti.Y); // create the big picture int pixelWidth = (tileCountX + 1) * TileRecord.PixelWidth; int pixelHeight = (tileCountY + 1) * TileRecord.PixelHight; int intDPI = Convert.ToInt32(dpi); intDPI = 8; byte[] sourceArray; RectangleF sourceRect; // create the big picture CGBitmapContext bitmapImage = new CGBitmapContext(IntPtr.Zero, pixelWidth, pixelHeight, intDPI, pixelWidth * 4, CGColorSpace.CreateDeviceRGB(), CGImageAlphaInfo.PremultipliedFirst); //copy the tiles into the big picture int index = 0; foreach (TileIndexRecord tileIndexRecord in indexFile.TileIndexRecords) { // get the tile record tile = chartFile.TileRecords[index]; // extract the byte array for the given palette sourceArray = tile.GetBytes(rgbPalette); unsafe { IntPtr unmanagedPointer = Marshal.AllocHGlobal(sourceArray.Length); Marshal.Copy(sourceArray, 0, unmanagedPointer, sourceArray.Length); // Call unmanaged code CGImage image = new CGImage(unmanagedPointer); Marshal.FreeHGlobal(unmanagedPointer); } sourceRect = new RectangleF(0, 0, TileRecord.PixelWidth, TileRecord.PixelHight); bitmapImage.DrawImage(new RectangleF(0,0,128,128),image); // copy the tile image into the big picture //bitmapImage.WritePixels(sourceRect, sourceArray, TileRecord.Stride, (tileIndexRecord.X * TileRecord.PixelWidth), (tileIndexRecord.Y * TileRecord.PixelHight)); // increment the index index++; } return bitmapImage; } 

El problema que estoy teniendo es con la línea:

 CGImage image = new CGImage(unmanagedPointer); 

Cuando se ejecuta esta línea obtengo la siguiente traza de stack:

 at (wrapper managed-to-native) MonoTouch.CoreGraphics.CGImage.CGImageRetain (intptr) <IL 0x00023, 0xffffffff> at MonoTouch.CoreGraphics.CGImage..ctor (intptr,bool) [0x00013] in /Developer/MonoTouch/Source/monotouch/src/shanetworking/CoreGraphics/CGImage.cs:104 at MonoTouch.CoreGraphics.CGImage..ctor (intptr) <IL 0x00003, 0x0002b> at Jargoon.Data.Arcs.Loader.ExtractWriteableBitmap (Jargoon.Data.Arcs.Records.RGBPaletteRecord,double,Jargoon.Data.Arcs.Raschts.ChartIndexFile,Jargoon.Data.Arcs.Raschts.RasterChartFile) [0x000db] in /Users/jacknutkins/Desktop/Jargoon/ARCSViewer/ARCSViewer/Loader.cs:587 at Jargoon.Data.Arcs.Loader.GetHiResImage (Jargoon.Data.Arcs.Records.RGBPaletteRecord) [0x00000] in /Users/jacknutkins/Desktop/Jargoon/ARCSViewer/ARCSViewer/Loader.cs:362 at ARCSViewer.ARCSViewerViewController.ViewDidLoad () [0x0001c] in /Users/jacknutkins/Desktop/Jargoon/ARCSViewer/ARCSViewer/ARCSViewerViewController.cs:36 at (wrapper runtime-invoke) object.runtime_invoke_void__this__ (object,intptr,intptr,intptr) <IL 0x0004e, 0xffffffff> at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication.UIApplicationMain (int,string[],intptr,intptr) <IL 0x0009f, 0xffffffff> at MonoTouch.UIKit.UIApplication.Main (string[],string,string) [0x00042] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:29 at ARCSViewer.Application.Main (string[]) [0x00000] in /Users/jacknutkins/Desktop/Jargoon/ARCSViewer/ARCSViewer/Main.cs:17 at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object (object,intptr,intptr,intptr) <IL 0x00050, 0xffffffff> 

Si establezco un punto de interrupción y paso por el código, cuando llegue a la línea de problema, las variables tendrán los siguientes estados ( Nota: este error ocurre en la primera iteración):

 unmanagedPointer - 0xa25e00 - System.IntPtr sourceArray - {byte[49152]} - byte[] 

Y al realizar una inspección adicional de las variables, parece que están pobladas correctamente.

¿Alguien puede explicar lo que está pasando aquí?

Soy nuevo en el desarrollo de MonoTouch, pero tengo experiencia con iOS y Objective-C, así que si necesitas más información, avísame.

Gracias por adelantado,

Tysin

El CGImage (IntPtr) es para crear un contenedor gestionado para una CGImage ObjectiveC existente, no para crearla a partir de datos de bitmap.

Creo que quieres hacer algo como esto:

 using (var provider = new CGDataProvider (sourceArray)) { using (var image = new CGImage (width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpace, bitmapFlags, provider, null, false, intent)) { bitmapImage.Draw (new RectangleF(0,0,128,128),image); } }