Korzystanie z GPUImage do odtworzenia efektu szkła iOS 7

Próbuję użyć efektu szkła w stylu iOS 7 w moim szkle, stosując efekty obrazu do zrzutu ekranu MKMapView. Ta kategoria UIImage , dostarczona przez Apple, jest tym, czego używam jako punktu odniesienia. Metoda ta desaturatuje obraz źródłowy, stosuje odcień koloru i mocno rozmywa przy użyciu wartości wejściowych:

[image applyBlurWithRadius:10.0
                 tintColor:[UIColor colorWithRed:229/255.0f green:246/255.0f blue:255/255.0f alpha:0.33] 
     saturationDeltaFactor:0.66
                 maskImage:nil];

To daje efekt, którego szukam, ale trwa zbyt długo - od .3 do .5 sekund, aby renderować na iPhone 4.

Tutaj wpisz opis obrazka

I would lubię korzystać z doskonałych GPUImage ponieważ moje wstępne próby były około 5-10 razy szybsze, ale po prostu nie mogę tego zrobić dobrze.

GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:image];

GPUImageSaturationFilter *saturationFilter = [[GPUImageSaturationFilter alloc] init];
saturationFilter.saturation = 0.33; // 1.0 - 0.66;
[stillImageSource addTarget:saturationFilter];

GPUImageMonochromeFilter *monochromeFilter = [[GPUImageMonochromeFilter alloc] init];
[monochromeFilter setColor:(GPUVector4){229/255.0f, 246/255.0f, 1.0f, 0.33f}];
[monochromeFilter setIntensity:0.2];
[saturationFilter addTarget:monochromeFilter];

GPUImageFastBlurFilter *blurFilter = [[GPUImageFastBlurFilter alloc] init];
blurFilter.blurSize = 2;
blurFilter.blurPasses = 3;
[monochromeFilter addTarget:blurFilter];

[saturationFilter prepareForImageCapture];
[monochromeFilter prepareForImageCapture];

[stillImageSource processImage];
image = [blurFilter imageFromCurrentlyProcessedOutput];

To tworzy obraz, który jest blisko, ale nie do końca tam

Tutaj wpisz opis obrazka

Rozmycie nie wydaje się być wystarczająco głębokie, ale kiedy próbuję zwiększyć blurSize powyżej, staje się siatką, prawie jak kalejdoskop. Możesz zobaczyć siatkę tutaj, powiększając drugi obraz. Odcień-kolor, który staram się naśladować wydaje się, że po prostu zmyć obraz zamiast nakładania i mieszania, co myślę, że próbka Apple robi.

Próbowałem skonfigurować filtry zgodnie z komentarzami @ BradLarson w kolejne pytanie . Czy używam niewłaściwych filtrów GPUImage, aby odtworzyć ten efekt, czy po prostu źle je ustawiam?

Author: Community, 2013-08-23

1 answers

OK, pracuję nad czymś tutaj od jakiegoś czasu, i w końcu mam to funkcjonalne. Właśnie wprowadziłem szereg zmian do filtrów rozmycia gpuimage w ramach, a w rezultacie uważam, że mam rozsądną replikę efektu rozmycia Apple, którego używają do takich rzeczy, jak widok centrum sterowania.

Wcześniej rozmycia, które miałem w ramach, używały pojedynczego wstępnie obliczonego promienia, a jedynym sposobem na wpływanie na ich intensywność było dostosowanie odstępów, przy których próbkowane piksele z obrazu wejściowego. Z ograniczoną liczbą próbek na piksel, zmiana wielokrotności dla odstępów między próbkowanymi pikselami znacznie powyżej 1,5 zaczęła wprowadzać poważne artefakty blokujące, gdy piksele były pomijane.

Nowa implementacja rozmycia Gaussa, którą zbudowałem, łączy zalety wydajności wstępnie obliczonych wag Gaussa z możliwością użycia dowolnego promienia (sigma) dla rozmycia Gaussa. Robi to, generując shadery w locie, tak jak są potrzebne dla różnych promieni. Zmniejsza również liczbę próbek tekstur wymaganych dla danego promienia rozmycia, wykorzystując interpolację sprzętową do odczytu dwóch tekstur na raz dla każdego punktu próbki.

Nowy GPUImageiOSBlurFilter łączy ten dostrojony Filtr rozmycia Gaussa o dowolnym promieniu z filtrem korekcji kolorów, który wydaje się replikować korektę kolorów wykonaną przez Apple po ich rozmyciu. Dodałem poniższe porównanie do mojej odpowiedzi tutaj , ale pokazuje, że Apple wbudowane rozmycie z widoku centrum sterowania po lewej i mój nowy filtr rozmycia GPUImage po prawej:

Apple ' s blurRozmycie GPUImage

Jako sposób na poprawę wydajności (rozmycie Apple wydaje się występować przy sigma 48, co wymaga dość dużego obszaru do próbkowania dla każdego piksela), używam 4X downsamplingu przed rozmyciem Gaussa, a następnie 4X upsamplingu. Zmniejsza to liczbę pikseli, które muszą być rozmyte o 16X, a także zmniejsza rozmycie sigma z 48 do 12. IPhone 4S może rozmazać cały ekran w około 30 ms za pomocą tego filtra.

Poprawienie smugi to jedno. Apple nadal nie zapewnia szybkiego sposobu uzyskania zawartości obrazu za widokami, więc najprawdopodobniej będzie to wąskie gardło dla szybko zmieniających się treści.

 32
Author: Brad Larson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:30:24