12

どのような状況でCGBitmapContextは割り当てに失敗しますか?テーブルビューがあり、複数のビューオプションがあります。ユーザーは、プレビューだけの小さなテーブルセル、1行に1つの大きなプレビュー、または1行に2つのプレビューを並べて表示できます。最初の2つは問題なくレンダリングされますが、3つ目は失敗します。CGBitmapContextCreateからのエラーメッセージはありません。使用しようとした後のエラー(つまり、無効なコンテキスト0x0)だけです。

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
//size is a passed parameter
CGContextRef c = CGBitmapContextCreate(NULL, size.width, size.height, 8, size.width*4, colorSpace, kCGImageAlphaNoneSkipLast);
CGColorSpaceRelease(colorSpace);

私はiOS5.0をターゲットにしており、5.1でビルドしています。動作しているバージョンと動作していないバージョンの唯一の違いは、動作していないバージョンが2回実行しようとすることです(サイズが小さく、100x100未満)。 右側だけがこの問題を抱えています(つまり、2回目の試行)。最初の試みはまだ機能します。

4

2 に答える 2

14

これは、size.widthおよび/またはsize.heightが0の場合に発生する可能性がありNSLogます。このメソッドを呼び出すたびにサイズをチェックして、それが当てはまるかどうかを確認してください。

于 2012-06-05T10:01:55.237 に答える
6

後世のために、これは、指定された幅に対応するのに十分な大きさではない「bytesPerRow」を指定した場合にも発生する可能性があります。

https://developer.apple.com/library/ios/qa/qa1702/_index.htmlからのAppleのサンプルコードを使用する

返されたCVPixelBufferGetWidth()、CVPixelBufferGetHeight()、およびCVPixelBufferGetBytesPerRow()が、それぞれ1280、720、および1960を返していることに気付きました。ここでの「bytesPerRow」値(1960)は、1280ピクセル幅の画像のすべてのバイトを保持するのに十分な幅ではありません。これはおそらくAppleのAPIのバグのようです。

したがって、CVPixelBufferGetBytesPerRow()によって返される値を使用する代わりに、「width * 4」を使用しましたが、これは問題なく機能しました。

于 2015-09-02T18:27:44.857 に答える