2013-02-07 50 views
0

我們有從PNG數據提供者創建CGImage的代碼,然後在CGBitmapContext上繪製它。大多數PNG工作正常,但不支持一些PNG格式(請參閱here),所以我們得到一個NULL上下文。這就是我們如何創建它:如何在Core Graphics中繪製任何PNG格式

CGContextRef imageContext = CGBitmapContextCreate(NULL, width, height, CGImageGetBitsPerComponent(image), 0, CGImageGetColorSpace(image), CGImageGetBitmapInfo(image));

現在,雖然這種方式並不核芯顯卡工作,使具有相同PNG一個UIImage工作。我們確實手動確認了給定的PNG格式確實不被支持(24 bpp,8 bpc,RGB only(沒有alpha通道))。此外,傳遞一個kCGImageAlphaPremultipliedFirst的CGBitmapInfo工作!

因此,似乎有辦法讓雜散PNG呈現,而UIImage實現了這一點。但是我們真的不能在這裏使用UIImage(我們想要在後臺線程上預渲染位圖),因此問題 - 在Core Graphics中渲染所有PNG有什麼好的啓發法?或者,我們還可以使用其他繪圖技術來實現相同的效果(但不使用Core Graphics)?

回答

2

第一條:UIImage現在是線程安全的。 From the docs

這也意味着圖像對象本身可以安全地從任何 線程使用。

第二個:您的問題只限於可用的CGBitmapContext像素格式的限制量。

如果你總是使用32bpp,RGB預乘alpha應該都可以。當然,你不會得到PNG的原始像素格式(如調色板,B & W或其他),但通常無關緊要,因爲在屏幕上繪製圖像是用RGB完成的。

+0

第二:如果您的意思是隻提供特定格式,那麼這是最後的解決方案。感覺就像我們現在還沒有去那裏。首先重點:這很有趣,我試圖使用UIKit實現預渲染,但至少[UIImage drawAtPoint:]並不像我預期的那樣運行。我會繼續嘗試,但CG解決方案已經證明了自己。 –

+1

@VladimirGritsenko我對第二個建議的含義是:始終使用完整的RGBA,32bpp CGBitmapContext。然後,您將能夠將每個PNG(即ImageIO理解的)渲染到該上下文中。 ImageIO是UIImage和CGImage用於讀取圖像的基礎庫。它可以讀取我偶然發現的每一個PNG。您遇到的問題是由於您嘗試使用PNG的像素格式設置圖像上下文。這不起作用,因爲CGBitmapContext在支持的格式方面受到相當的限制。 –

+1

下面是[支持的位圖格式列表](https://developer.apple.com/library/ios/documentation/graphicsimaging/Conceptual/drawingwithquartz2d/dq_context/dq_context.html#//apple_ref/doc/uid/TP30001066-CH203順便說一句,BCIBHHBB)。 –

相關問題