Ponieważ pytanie jest dość szeroka, gdyż stoi nie dostarczy kod, ale ogólne podejście, w jaki sposób osiągnąć to.
Są to kroki, które należy podjąć:
Pierwsze przejście: zmniejszyć obraz na podstawie koloru i tolerancji. Jeśli kolor jest absolutny, po prostu wykonaj iterację i utwórz kanał alfa, w którym piksel nie pasuje do koloru. W przypadku tolerancji lepszym podejściem byłoby zastosowanie konwersji RGB-HSL, a następnie zdefiniowanie promienia i sprawdzenie, czy odczytany kolor znajduje się w promieniu w docelowym kolorze. Weź również pod uwagę wartości kanału alfa.
Zostanie wyświetlony obraz z kanałem alfa i tylko te kolory, które są po.
drugim przejściu: Run obraz przez roztwór przy użyciu kwadratów Marching algorytm (wtyczka bezwstydny: Zrobiłem własną here (licencja MIT) zainspirowany to pytanie, i to wydaje się być szybciej niż inni włącznie. wtyczkę D3 - ale każdy to zrobi!). Wyodrębnij ścieżki, wykonując iterację po obrazie, dla każdej iteracji usuń śledzoną część. Robisz to, głaszcząc + wypełniając uzyskaną ścieżkę, używając trybu kompozycji destination-out
. Użyj szerokości linii około 3-5 specyficznej dla twojego scenariusza.
Możesz użyć Ramera-Douglasa-Peuckera, aby zmniejszyć punkty lub pozostawić je takimi, jakimi są. Brak redukcji punktu pozwoli uzyskać dokładną ścieżkę, ale będzie również gorszy.
Trzeci przebieg: Teraz masz dane ścieżki, które można wykorzystać do przycięcia części z oryginalnego obrazu. Dodaj wszystkie dane ścieżki (użyj ścieżek podrzędnych za pomocą metody moveTo() dla każdej ścieżki), a następnie tryb kompozycji, aby usunąć piksele, których nie chcesz. Lub, jeśli jesteście tylko po ścieżkach: gotowe!
Dowolny obraz + Dowolny kolor + Dowolny kształt sprawia, że pytanie jest zbyt szerokie. Ale i tak kilka myśli: "Kolor" na płótnie to RGBA, które trudno jest dopasować, jeśli cel ma nawet niewielkie odmiany kolorów RGBA. Możesz przekonwertować wszystkie wartości RGBA na HSL, a następnie wybrać kolor, który zapewnia większą tolerancję kolorów. "Kształt" jest niejednoznaczny, a pojedynczy kształt może być kombinacją wielu odłączonych części, ale można wykonać podstawowe wykrywanie krawędzi za pomocą [Marszowych kwadratów] (http://stackoverflow.com/questions/28207232/draw-border-round- nieprzezroczysty-część-obrazu-na-płótnie/28220510 # 28220510) Algorytm. – markE