2017-04-07 12 views
20

Pracuję nad niestandardowym filtrem obrazu. I natknąłem się na jedno trudne zadanie, w którym mam zastosować zniekształcone filtry, jak można zobaczyć w Funny face effect app. Chcę opracować pierwsze 3 filtry dostępne w Funny Face Effects.Jak wdrożyć filtr zniekształceń obrazu zniekształceń w systemie Android?

Aby wprowadzić taki efekt, zacząłem używać GPUImageView GPUImage iw tym celu za pomocą paska wyszukiwania zniekształcono obraz od środka. Osiągnąłem z tego zniekształcenie Bulge. Ale czy istnieje sposób, w jaki mogę wdrożyć filtr oporu, w którym mogę zniekształcać obraz za pomocą gestu przeciągania?

Próbowaliśmy wyszukać jakiekolwiek inne klasy stron trzecich inne niż GPUImage. Ale nie mogliśmy znaleźć przydatnych rzeczy.

Nasze zapytania są w ramach: -

1) Czy możliwe jest zastosowanie filtra za pomocą Drag Drag gest? (Dowolny fragment kodu lub znaczący odnośnik)

2) Każda inna klasa stron trzecich inna niż GPU, która może nam pomóc uzyskać wyniki powyżej.

Z góry dziękuję!

enter image description here

+0

Proszę również zamieścić kilka fragmentów kodu z wyjaśnieniem, co już wypróbowałeś lub jakie biblioteki natrafiłeś. – DroidDev

+0

@DroidDev, próbowałem z https://github.com/CyberAgent/android-gpuimage, który ma filtry Effect. Działa dobrze, gdy stosuje się pojedynczy filtr, ale gdy próbuję zastosować wiele filtrów, kompletnie się nie udaje. Obraz jest zniekształcony z losowych punktów. – Maddy

+0

https://github.com/ragnraok/android-image-filter. Możesz wypróbować funkcję motion blur – Rndomcoder

Odpowiedz

5

Jednym ze sposobów, aby to osiągnąć jest użycie dodatkowego teksturę, aby określić do shadera fragmentów deformacja zastosowania. Możesz zmodyfikować zawartość tekstury z aplikacji, gdy użytkownik dotknie obrazu, aby zastosować zniekształcenia.

GPUImageBulgeDistortionFilter rozszerza GPUImageFilter, który jest przeznaczony do stosowania tylko jednej tekstury.

Będziesz musiał zduplikować wiązanie tekstury (glBindTexture) i przypisać do shadera fragmentów (glUniform1i) w GPUImageFilter, używając 1 dla nowej tekstury (zamiast 0). Będziesz także potrzebować zduplikować glGetUniformLocation i użyć innej nazwy zamiast inputImageTexture, na przykład inputImageTexture2.

Modyfikacja cieniujący fragment w GPUImageBulgeDistortionFilter lub tworzyć nową klasę pochodzący z GPUImageBulgeDistortionFilter dodanie „jednolity sampler2D inputImageTexture2; \ n” +

koniec dodać kod używany teksele inputImageTexture2 do odkształcania danych w inputImageTexture w ten sam fragment cieniującego .

Powiązane problemy