0

PNG データ プロバイダーから CGImage を作成し、それを CGBitmapContext に描画するコードがあります。ほとんどの PNG は問題なく動作しますが、一部の PNG 形式はサポートされていないため (こちらを参照)、NULL コンテキストが取得されます。作成方法は次のとおりです。

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

この方法は Core Graphics では機能しませんが、同じ PNG で UIImage を作成すると機能します。また、指定された PNG 形式が実際にサポートされていないことを手動で確認しました (24 bpp、8 bpc、RGB のみ (アルファ チャネルなし))。さらに、kCGImageAlphaPremultipliedFirst の CGBitmapInfo を渡すと機能します。

とにかく、迷子のPNGをレンダリングさせる方法があるようで、UIImageはこれを実装しています。しかし、ここで UIImage を実際に使用することはできません (バックグラウンド スレッドでビットマップを事前にレンダリングしたい)。したがって、質問 - Core Graphics ですべての PNG をレンダリングするための優れたヒューリスティックは何ですか? あるいは、同じ効果を実現するために (コア グラフィックスを使用せずに) 他にどのような描画手法を使用できますか?

4

1 に答える 1

2

最初: UIImage最近ではスレッドセーフです。ドキュメントから

また、画像オブジェクト自体がどのスレッドからでも安全に使用できることも意味します。

2番目:問題は、利用可能な CGBitmapContext ピクセル形式の制限された量にのみあります。

常に 32bpp を使用する場合は、あらかじめ乗算されたアルファを使用した RGB がすべて機能するはずです。もちろん、PNG の元のピクセル形式 (カラー パレット、白黒など) は得られませんが、画面への画像の描画は RGB で行われるため、通常は問題ありません。

于 2013-02-07T15:18:19.300 に答える