首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MonoTouch中的CGBitmapContext引发无效的句柄异常

MonoTouch中的CGBitmapContext引发无效的句柄异常
EN

Stack Overflow用户
提问于 2012-09-05 20:40:17
回答 1查看 718关注 0票数 0

我刚接触MonoTouch,最近将代码从标准C#转换为符合MonoTouch的代码,以便可以在iPhone应用程序中使用。我已经成功地转换了代码,但是我遇到了这个方法的问题,我使用它来返回位图上下文:

代码语言:javascript
复制
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);

            int bytesPerRow = (int)TileRecord.PixelWidth * 4; // note that bytes per row should 
    //be based on width, not height.

            CGColorSpace colorSpace = CGColorSpace.CreateDeviceRGB();
            CGImageAlphaInfo info = CGImageAlphaInfo.NoneSkipFirst;

            // create the big picture 
            bitmapImage = new CGBitmapContext(System.IntPtr.Zero, pixelWidth, pixelHeight, intDPI, intDPI, colorSpace, info);

            byte[] sourceArray;
            RectangleF sourceRect;

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

                GCHandle pinnedArray = GCHandle.Alloc(sourceArray, GCHandleType.Pinned);
                IntPtr pointer = pinnedArray.AddrOfPinnedObject();
                //do your stuff
                //pinnedArray.Free();

                CGImage image = new CGImage(pointer);
                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;
        }

下面是堆栈跟踪:

代码语言:javascript
复制
System.Exception: Invalid handle
  at MonoTouch.CoreGraphics.CGContext..ctor (IntPtr handle, Boolean owns) [0x00022] in /Developer/MonoTouch/Source/monotouch/src/shared/CoreGraphics/CGContext.cs:136
  at MonoTouch.CoreGraphics.CGBitmapContext..ctor (IntPtr data, Int32 width, Int32 height, Int32 bitsPerComponent, Int32 bytesPerRow, MonoTouch.CoreGraphics.CGColorSpace colorSpace, CGImageAlphaInfo bitmapInfo) [0x00000] in <filename unknown>:0
  at Jargoon.Data.Arcs.Loader.ExtractWriteableBitmap (Jargoon.Data.Arcs.Records.RGBPaletteRecord rgbPalette, Double dpi, Jargoon.Data.Arcs.Raschts.ChartIndexFile indexFile, Jargoon.Data.Arcs.Raschts.RasterChartFile chartFile) [0x00079] in /Users/jacknutkins/Desktop/Jargoon/ARCSViewer/ARCSViewer/Loader.cs:569
  at Jargoon.Data.Arcs.Loader.GetHiResImage (Jargoon.Data.Arcs.Records.RGBPaletteRecord rgbPalette) [0x00000] in /Users/jacknutkins/Desktop/Jargoon/ARCSViewer/ARCSViewer/Loader.cs:361
  at ARCSViewer.ARCSViewerViewController.ViewDidLoad () [0x0001c] in /Users/jacknutkins/Desktop/Jargoon/ARCSViewer/ARCSViewer/ARCSViewerViewController.cs:37
  at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
  at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00042] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:29
  at ARCSViewer.Application.Main (System.String[] args) [0x00000] in /Users/jacknutkins/Desktop/Jargoon/ARCSViewer/ARCSViewer/Main.cs:17

错误发生在以下行:

代码语言:javascript
复制
// create the big picture 
            bitmapImage = new CGBitmapContext(System.IntPtr.Zero, pixelWidth, pixelHeight, intDPI, intDPI, colorSpace, info);

我对MonoTouch还很陌生,所以如果很明显的话,请试着容忍我,但是有谁能解释一下发生了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-05 21:08:14

这通常发生在内存不足的时候。不过,(设备)控制台通常会打印更多信息。

我的猜测是,您并没有释放正在创建的CGBitmapContext。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12281658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档