2012-02-03 4 views

答えて

4

CGBitmapContextCreateを使用せず、UIGraphicsBeginImageContextWithOptionsを使用すると、はるかに簡単です。 UIGraphicsBeginImageContextには3つのパラメータがある

UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), YES, 1.0f); 
CGContextRef context = UIGraphicsGetCurrentContext(); 

//do your drawing 

UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEdnImageContext(); 

//your resultant UIImage is now stored in image variable 

: - これはイメージが透明性を持っているかどうかはあなたが

  • をしたい何もすることができます

    1. 画像のサイズ、このようにそれを使用します

    2. 画像のピクセルのスケール。 0.0がデフォルトであるため、iPhone 3GSでは1.0になり、iPhone 4では網膜ディスプレイで2.0になります。あなたが望む任意の縮尺で渡すことができます。したがって、5.0を渡すと、Retinaディスプレイの1ピクセルが実際にスクリーン上に2x2ピクセルであるように、イメージの各ピクセル単位は実際にはビットマップの5x5ピクセルになります。

    編集:それはUIGraphicsBeginImageContext()はスレッドセーフであるかどうかの質問は少し物議を醸すように思われることが判明しました。バックグラウンドスレッドでこれを同時に実行する必要がある場合は、ここでCGBitMapContextCreate()を使用する代わりの方法(かなり複雑なアプローチ)があります。UIGraphicsBeginImageContext vs CGBitmapContextCreate

  • +1

    これは良い解決策ではありません。 UIGraphicsBeginImageContextと他のUI ...関数はスレッドセーフではなく、メイントレッドで実行されています。この機能を使用すると、アプリケーションのUIがフリーズします。 –

    +0

    スレッドについては誰が言ったのですか?とにかく、あなたがスレッド化されたコンテキストでそれを使う必要があれば、@ synchronizedブロックにUIGraphicsBeginImageContext()をラップし、CGContextRefを取得したら実際の描画を行うことができます。 –

    +0

    @MartinPilchそれらがすべてメインスレッドで実行されているという事実は、それらをスレッドセーフにするものです。それらは単一のスレッドからのみ呼び出されます**メインスレッド**スレッドには入っていません。 – Abizern

    関連する問題