21

現在のグラフィック コンテキストから UIImage オブジェクトを作成したいと思います。より具体的には、私のユースケースは、ユーザーが線を引くことができるビューです。それらは段階的に描画される場合があります。それらが完了したら、描画を表す UIImage を作成したいと思います。

これが drawRect: が私にとって今のように見えるものです:

- (void)drawRect:(CGRect)rect
{
CGContextRef c = UIGraphicsGetCurrentContext();

CGContextSaveGState(c);
CGContextSetStrokeColorWithColor(c, [UIColor blackColor].CGColor);
CGContextSetLineWidth(c,1.5f);

for(CFIndex i = 0; i < CFArrayGetCount(_pathArray); i++)
{
    CGPathRef path = CFArrayGetValueAtIndex(_pathArray, i);
    CGContextAddPath(c, path);
}

CGContextStrokePath(c);

CGContextRestoreGState(c);
}

... ここで、_pathArray は CFArrayRef 型であり、touchesEnded: が呼び出されるたびに入力されます。また、drawRect: は、ユーザーが描画するときに複数回呼び出される可能性があることに注意してください。

ユーザーが完了したら、グラフィック コンテキストを表す UIImage オブジェクトを作成したいと思います。これを行う方法に関する提案はありますか?

4

3 に答える 3

7

UIImage * image = UIGraphicsGetImageFromCurrentImageContext();

保管する必要がある場合はimage、必ず保管してください。

編集: drawRect の出力を画像に保存する場合は、を使用してビットマップ コンテキストを作成し、UIGraphicsBeginImageContextバインドされた新しいコンテキストで drawRect 関数を呼び出すだけです。作業中の CGContextRef を drawRect 内に保存するよりも簡単です。これは、そのコンテキストにビットマップ情報が関連付けられていない可能性があるためです。

UIGraphicsBeginImageContext(view.bounds.size);
[view drawRect: [myView bounds]];
UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

ケルビンが言及したアプローチを使用することもできます。UIWebView のようなより複雑なビューから画像を作成する場合は、彼の方法の方が高速です。ビューのレイヤーを描画するためにレイヤーを更新する必要はありません。画像データをあるバッファーから別のバッファーに移動するだけです。

于 2009-07-11T04:46:37.757 に答える