Pracuję nad interfejsem użytkownika dla aplikacji i próbuję użyć ikon w skali szarości i pozwolić użytkownikowi zmienić motyw na wybrany przez siebie kolor. Aby to zrobić, próbuję po prostu zastosować jakiś rodzaj filtra ColorFilter, aby nałożyć kolor na element do rysowania. Próbowałem użyć PorterDuff.Mode.MULTIPLY i działa prawie dokładnie tak, jak potrzebuję, z wyjątkiem tego, że białe również są nakładane na kolor. Idealnie szukam czegoś w rodzaju trybu mieszania „Kolor” w programie Photoshop, w którym grafika zachowuje przezroczystość i jasność, a jedynie modyfikuje kolor obrazu. Na przykład:
staje się
Po przeprowadzeniu pewnych badań wydaje się, że klasa ColorMatrixColorFilter może robić to, czego potrzebuję, ale nie mogę znaleźć żadnych zasobów wskazujących na sposób wykorzystania macierzy. To matryca 4x5, ale muszę wiedzieć, jak zabieram się do projektowania matrycy. Jakieś pomysły?
EDYCJA: W porządku, to, co do tej pory odkryłem, wygląda następująco:
1 0 0 0 0 //red
0 1 0 0 0 //green
0 0 1 0 0 //blue
0 0 0 1 0 //alpha
Gdzie ta macierz jest macierzą tożsamości (po zastosowaniu nie powoduje żadnych zmian), a liczby mieszczą się w zakresie od 0 do 1 (zmiennoprzecinkowe). Ta macierz zostanie pomnożona z każdym pikselem, aby przekonwertować na nowy kolor. Więc w tym miejscu zaczyna się dla mnie rozmywać. Więc myślę, że każdy piksel byłby wektorem 1 x 4 zawierającym wartości argb (np. 0.2, 0.5, 0.8, 1
), Które byłyby kropkowane z macierzą transformacji. Aby podwoić intensywność czerwieni obrazu, należy użyć macierzy takiej jak:
2 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
co dałoby wektor (kolor) 0.4, 0.5, 0.8, 1
. Na podstawie ograniczonych testów wydaje się, że tak jest i działa prawidłowo, ale w rzeczywistości nadal mam ten sam problem (tj. Białe kolory nabierają koloru). Dalsza lektura mówi mi, że dzieje się tak, ponieważ dokonuje konwersji wartości RGB, podczas gdy w przypadku zmiany barwy wartości powinny najpierw zostać przekonwertowane na wartości HSL. Więc prawdopodobnie mógłbym napisać klasę, która odczyta obraz i przekształci kolory i przerysuje obraz z nowymi kolorami. Stwarza to KOLEJNY problem z StateListDrawables, ponieważ nie jestem pewien, jak zabrać każdy z nich w kodzie i zmodyfikować je wszystkie oraz jak powolny byłby to proces. : /
Hmm, w porządku, więc wydaje mi się, że kolejne pytanie, które zadałbym, dotyczy tego, czy matryca może być użyta do konwersji RGB na inną przestrzeń kolorów z informacją o jasności, taką jak L a b lub HSL? Jeśli tak, mógłbym po prostu pomnożyć macierz dla tej konwergencji, a następnie dostosować odcień do TEJ macierzy, a następnie zastosować tę macierz jako ColorFilter.
źródło
Odpowiedzi:
To jest to, czego używam w mojej grze. To jest kompilacja różnych części znalezionych w różnych artykułach na stronach internetowych. Podziękowania trafiają do oryginalnego autora z linków @see. Zwróć uwagę, że z matrycami kolorów można zrobić znacznie więcej. W tym odwracanie itp.
Aby to zakończyć, powinienem dodać przykład:
źródło
mat
w Twoim kodzie ma 5 wierszy? Czy nie powinno to być tylko 4 rzędy (po jednym na każdy RGBA)?ColorMatrix
, cofam go. Ostatni wiersz wmat
ogóle nie jest używany.ColorMatrix
Konstruktor wykonuje tylko pierwsze 4 rzędy (20 kopii pierwsze pływaki danej matrycy źródłowego).tutaj jest pełny kod, jeśli chcesz dostosować jasność, kontrast, nasycenie i odcień. Cieszyć się! Wielkie dzięki dla @RichardLalancette
źródło
adjustContrast
metody: (1) wyrażenievalue<<0
wydaje się zbędne, ponieważ zawsze byłoby równe (tylko)value
. (2) Czy jakovalue
liczba całkowita nievalue % 1
będzie zawsze równe 0?Dla każdego, kto jest zainteresowany używaniem ColorMatrixColorFilter. Próbka, której tutaj użyłem, zamieniła każdy piksel na czerwony, kiedy rysowałem bitmapę na płótnie.
Komentarz na zajęciach pochodzi z: http://developer.android.com/reference/android/graphics/ColorMatrix.html To daje pewne informacje o tym, jak to działa
źródło
Poniższa klasa jest ulepszeniem odpowiedzi, które zostały już opublikowane. Ułatwia to czytanie i tworzenie
ColorFilter
z plikuBitmap
.Przykładowe użycie:
źródło
Nie ma liniowej zależności między odcieniem a RGB. Odcień jest definiowany fragmentarycznie w fragmentach 60 ° ( http://en.wikipedia.org/wiki/HSL_color_space#General_approach ), dlatego nie ma prostej konwersji macierzy między HSV i RGB. Aby zmienić odcień obrazu, możesz użyć następującej metody:
źródło
Myślę, że ta metoda da ci to, czego chcesz:
http://android.okhelp.cz/hue-color-colored-filter-bitmap-image-android-example/
źródło
Podobnie jak w przypadku pozostałych odpowiedzi, użyłem macierzy kolorów do zaimplementowania tego zachowania, ale możesz przekazać zwykły zasób kolorów Androida. Macierz odwzorowuje kolor w zakresie między wartością obrazu a bielą.
źródło
Zrobiłem mały tester ColorMatrixFilter, oparty na następującym fragmencie:
Możesz to sprawdzić tutaj: https://play.google.com/store/apps/details?id=org.vaelostudio.colormatrixtester
źródło
Mimo że wiele użytecznych efektów można osiągnąć, używając narzędzia
ColorMatrix
, osobiście rozważałbym użycieColorMap[]
wraz zImageAttributes
. W ten sposób możemy zdefiniować, które kolory należy zastąpić którymi kolorami.źródło
ColorMap
? Myślę, że w standardowych bibliotekach java / android nie ma takiej klasy.Sposób, w jaki to rozwiązałem, to zacząć od obrazu w skali szarości.
oryginalny ---> grayImage
możesz to łatwo zrobić w Photoshopie lub jeśli musisz to zrobić w kodzie, możesz użyć następującej metody.
Po uzyskaniu obrazu w skali GrayScale możesz użyć trybu OVERLAY PorterDuff, aby dodać żądany kolor.
Powyższy wynik jest następujący randomColorGif
źródło