2011-06-23 44 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);無效。你不能創建一個沒有alpha通道的位圖上下文。 – PleaseHelp

+0

btw - 如果您查看應用程序的日誌輸出(您可能需要檢查Console.app中的系統日誌),那麼無論何時嘗試創建帶有無效參數的位圖上下文,CGBitmapContextCreate都會打印一條錯誤消息。 – nielsbot

回答

7

我的理解是,如果你傳入零,它會根據bitsPerComponent和width參數計算每行的字節數。您可能需要在每行字節末尾添加填充(如果您的設備需要它或其他約束)。在這種情況下,您可以傳遞一個不僅僅是寬度*(每像素字節數)的值。我可以想象這在現代i/MacOS開發中可能從未需要,除了一些奇怪的邊緣情況優化之外。

+1

聽起來夠合理。如果蘋果在某個地方的文檔中澄清了這一點(如果它在那裏,我沒有找到它),那將會很好。我發現過分依賴無證行爲有點麻煩。 –

+0

bytesPerRow 位圖每行使用的內存字節數。如果數據參數爲NULL,則傳遞值0會導致自動計算該值。 – Bogdan

+0

我想我會在這裏添加這個(來自CGBitmapContext頭文件):「每個像素的字節數等於 (bitsPerComponent *組件數+7)/ 8'。位圖 的每一行由」bytesPerRow '字節,其必須至少爲'每個像素的字節數'寬度*字節數 ';另外,'bytesPerRow'必須是每像素字節數的整數倍數 。「 – chrisp