Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MonoTouch-iPhone应用程序中的CGImage_C#_Ios_Pointers_Xamarin.ios_Cgimage - Fatal编程技术网

C# MonoTouch-iPhone应用程序中的CGImage

C# MonoTouch-iPhone应用程序中的CGImage,c#,ios,pointers,xamarin.ios,cgimage,C#,Ios,Pointers,Xamarin.ios,Cgimage,我使用一种方法创建一个大位图,然后用较小的平铺图像填充该位图: private CGBitmapContext ExtractWriteableBitmap( RGBPaletteRecord rgbPalette, double dpi, ChartIndexFile indexFile, RasterChartFile chartFile ) { //CGBitmapContext bitmapImage = null; Til

我使用一种方法创建一个大位图,然后用较小的平铺图像填充该位图:

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;
        }
我遇到的问题是线路:

CGImage image = new CGImage(unmanagedPointer);
当此行运行时,我得到以下堆栈跟踪:

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/shared/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>
在进一步检查变量时,它们似乎填充正确

有人能解释一下这是怎么回事吗

我是MonoTouch开发新手,但我有iOS和Objective-C的经验,所以如果您需要更多信息,请告诉我

提前感谢,

Tysin

构造函数
CGImage(IntPtr)
用于为现有ObjectiveC CGImage创建托管包装,而不是从位图数据创建它

我相信你想这样做:

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);
    }
}
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);
    }
}