web-dev-qa-db-ja.com

現在のグラフィックスコンテキストからUIImageを作成するにはどうすればよいですか?

現在のグラフィックスコンテキストから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オブジェクトを作成したいと思います。これを行う方法について何か提案はありますか?

21
figelwump

最初にグラフィックスコンテキストを設定する必要があります。

UIGraphicsBeginImageContext(myView.bounds.size);
[myView.layer renderInContext:UIGraphicsGetCurrentContext()];
viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
43
Kelvin

UIImage * image = UIGraphicsGetImageFromCurrentImageContext();

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

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

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

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

7
Ben Gotow

Swiftバージョン

    func createImage(from view: UIView) -> UIImage {
        UIGraphicsBeginImageContext(view.bounds.size)
        view.layer.renderInContext(UIGraphicsGetCurrentContext()!)
        let viewImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return viewImage
    }
3
Sahil Kapoor