Jak utworzyć UIImage na podstawie bieżącego kontekstu graficznego?


Chciałbym utworzyć obiekt UIImage na podstawie bieżącego kontekstu graficznego. Mówiąc dokładniej, moim przypadkiem użycia jest widok, w którym użytkownik może rysować linie. Mogą malować stopniowo. Po zakończeniu chciałbym stworzyć UIImage, który będzie reprezentował ich rysunek.
Oto jak drawRect: wygląda mi teraz:
- (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);
}
... gdzie _pathArray jest typu CFArrayRef i jest zapełniane za każdym razem, gdy wywoływana jest funkcja touchesEnded:. Zwróć również uwagę, że drawRect: może być wywoływany wiele razy, gdy użytkownik rysuje.
Gdy użytkownik skończy, chciałbym utworzyć obiekt UIImage, który reprezentuje kontekst graficzny. Jakieś sugestie, jak to zrobić?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Najpierw musisz ustawić kontekst graficzny:
UIGraphicsBeginImageContext(myView.bounds.size);
[myView.layer renderInContext:UIGraphicsGetCurrentContext()];
viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

UIImage * image = UIGraphicsGetImageFromCurrentImageContext ();
Jeśli chcesz zapisać obok niego
obraz
, pamiętaj, aby go zapisać!
EDYCJA: Jeśli chcesz zachować wynik drawRect w obrazie, po prostu utwórz kontekst bitmapy za pomocą
UIGraphicsBeginImageContext
i wywołaj drawRect z nowym powiązaniem kontekstowym. Jest to łatwiejsze do zrobienia niż przechowywanie CGContextRef, z którym pracujesz w drawRect, ponieważ ten kontekst może nie mieć skojarzonych z nim informacji bitmapowych.
UIGraphicsBeginImageContext(view.bounds.size);
[view drawRect: [myView bounds]];
UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Możesz także zastosować podejście wspomniane przez Kelvina. Jeśli chcesz utworzyć obraz z bardziej złożonego widoku, takiego jak UIWebView, jego metoda jest szybsza. Rysowanie warstwy widoku nie wymaga aktualizacji warstwy, wystarczy przenieść dane obrazu z jednego bufora do drugiego!
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


Szybka wersja

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

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się