2012-04-12 13 views
2

CGBitmapcontextに問題があります。 メッセージ "invalid handle"でCGBitmapContextを作成中にエラーが発生しました。ここで"無効なハンドル" 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では、便宜上byte []を受け入れる2つのオーバーロードを取得します。だから、このようにそれを使用する必要があります。

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

+0

ありがとう、この挙動はリンゴのドキュメントとは異なりますが、 'data 'はNULL以外の場合、ブロック の少なくともbytesPerRow * heightバイトを指しています。 'data 'がNULLの場合、コンテキストのデータは が自動的に割り当てられ、コンテキストが に割り当て解除されると解放されます。 – Hrissan

+0

重要なポイント!コンテキストの使用をやめる前にctxBufferをガベージコレクションすることを許可すれば、アプリケーションがランダムにクラッシュします。私はクラスレベルでコンテキスト変数を持っていましたが、ctxBufferは関数作成コンテキストではローカル変数でした。私がctxBufferをクラスレベルに移動するまで、アプリケーションはクラッシュしていました。注意してください! – Hrissan

0

メソッドに渡されたwidthまたはheightパラメータが0