To wydaje się proste, ale doprowadza mnie do szału. Czy można przekonwertować UIView zawierający AVCaptureVideoPreviewLayer jako podwarstwie na obraz do zapisania? Chcę utworzyć nakładkę rozszerzonej rzeczywistości i mieć przycisk zapisać obraz do rolki aparatu. Przytrzymanie przycisku zasilania + klawisza domowego powoduje przechwycenie zrzutu ekranu na rolce aparatu, co oznacza, że działa cała moja logika przechwytywania, ORAZ zadanie jest możliwe. Ale nie mogę sprawić, żeby program działał programowo.Czy można renderować AVCaptureVideoPreviewLayer w kontekście graficznym?
Przechwytywam bieżący podgląd obrazu z kamery przy użyciu AVCaptureVideoPreviewLayer. Wszystkie moje próby renderowania obrazu kończą się niepowodzeniem:
previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession];
//start the session, etc...
//this saves a white screen
- (IBAction)saveOverlay:(id)sender {
NSLog(@"saveOverlay");
UIGraphicsBeginImageContext(appDelegate.window.bounds.size);
UIGraphicsBeginImageContext(scrollView.frame.size);
[previewLayer.presentationLayer renderInContext:UIGraphicsGetCurrentContext()];
// [appDelegate.window.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(screenshot, self,
@selector(image:didFinishSavingWithError:contextInfo:), nil);
}
// To powoduje, że wszystko, Z WYJĄTKIEM dla warstwy podglądu, która jest pusta.
[appDelegate.window.layer renderInContext:UIGraphicsGetCurrentContext()];
Czytałem gdzieś, że może to być spowodowane problemami bezpieczeństwa iPhone'a. Czy to prawda?
Dla jasności: Nie chcę zapisywać obrazu dla kamery. Chcę zapisać przezroczystą warstwę podglądu nałożoną na inny obraz, tworząc w ten sposób przezroczystość. Jednak z jakiegoś powodu nie mogę sprawić, żeby działało.
Chyba co PO i próbują, jest uzyskanie paszy na żywo wideo za pomocą avcapturevideopreviewlayer i próbują dodać skalowany obraz. Próbuję dodać skalowany obraz do strumienia wideo na żywo w oparciu o wykrywanie twarzy, a zapisany zrzut ekranu jest tylko obrazem nakładki, a nie avcapturevideopreviewlayer. –
Na grafice GPU już dodałem filtry na warstwach, więc jestem prawie pewien, że istnieje sposób na zapisanie tylko bieżącej warstwy (w obrazie GPU jest metoda na wykonanie UIImage z ramki) Jeśli chcesz uzyskać dokładnie to, co jest na wyświetlaczu - tam jest sposobem na robienie zrzutów ekranu programowo. Nie pamiętam go teraz, ale widziałem go na stackoverflow) – Roma
Roma, dziękuję bardzo za odpowiedź. Chociaż nie korzystałem z GPUImage, na pewno wkrótce go użyję. Dzięki za umieszczenie go jako alternatywnej opcji. –