2011-06-23 3 views
4

Appleのサンプルコードでは、CGBitmapContextCreateのbytesPerRowパラメータに値0を指定することがよくあることに気付きました。たとえば、これはReflectionサンプルプロジェクトから出力されます。このCGBitmapContextCreateでは、なぜbytesPerRowは0ですか?

CGContextRef gradientBitmapContext = CGBitmapContextCreate(NULL, pixelsWide, pixelsHigh, 
                  8, 0, colorSpace, kCGImageAlphaNone); 

イメージの幅にピクセルあたりのバイト数を乗算するルートが常に存在するため、私にとっては奇妙に思えました。自分のコードにゼロを入れ替えて試してみました。確かに、それはまだ動作します。

size_t bitsPerComponent = 8; 
size_t bytesPerPixel = 4; 
size_t bytesPerRow = reflectionWidth * bytesPerPixel; 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef context = CGBitmapContextCreate(NULL, 
              reflectionWidth, 
              reflectionHeight, 
              bitsPerComponent, 
              0, // bytesPerRow ?? 
              colorSpace, 
              kCGImageAlphaPremultipliedLast); 

ドキュメントによれば、bytesPerRow「は、メモリのバイト数はビットマップの行ごとに使用する。」であるべきです

だからこの取引は何ですか?いつ私はゼロを供給することができ、いつ正確な値を計算しなければならないのですか?それを一方的に、あるいは他の方法で行うというパフォーマンス上の影響はありますか?

+0

投稿した例:CGBitmapContextCreate(NULL、pixelsWide、pixelsHigh、8,0、colorSpace、kCGImageAlphaNone);有効じゃない。アルファチャンネルなしでビットマップコンテキストを作成することはできません。 – PleaseHelp

+0

btw - アプリケーションからのログ出力を見ると(Console.appのシステムログをチェックする必要があるかもしれません) 'CGBitmapContextCreate'は、無効なパラメータでビットマップコンテキストを作成しようとすると、エラーメッセージを表示します。 – nielsbot

答えて

7

私が理解していることは、ゼロを渡すと、bitsPerComponentとwidthの引数に基づいて行あたりのバイト数が計算されるということです。バイトの各行の末尾に追加の埋め込みが必要な場合があります(デバイスに必要な場合など)。この場合、width *(ピクセルあたりのバイト数)以上の値を渡すことができます。現代のi/MacOS開発ではこれがおそらく必要ではないと思いますが、奇妙なエッジケースの最適化を除いてはそうです。

+1

十分に妥当な音です。 Appleがどこかのドキュメントでこれを明らかにしてくれればいいだろう(もしあれば、私はそれを見つけることができなかった)。私は、文書化されていない行動には多少悩まされています。 –

+0

bytesPerRow ビットマップの1行あたりに使用するメモリのバイト数。 dataパラメータがNULLの場合、0の値を渡すと、値が自動的に計算されます。 – Bogdan

+0

ビットマップ の各行は、「bytesPerRow(ビットマップコンポーネントの数)」と「bitsPerComponent * 'bytes以上でなければなりません。さらに、bytesPerRowは1ピクセルあたりのバイト数の整数倍でなければなりません "msgid。 – chrisp

関連する問題