Dal momento che la domanda è abbastanza ampio così com'è non mi fornire il codice, ma un approccio generale su come raggiungere questo.
Questi devono essere adottate le misure che ha bisogno:
Primo passaggio: ridurre l'immagine sulla base di un colore e di tolleranza. Se il colore è assoluto, continua semplicemente iterare e creare un canale alfa in cui il pixel non corrisponde al colore. Per tolleranza, un approccio migliore sarebbe utilizzare la conversione RGB-HSL, quindi definire un raggio e verificare se il colore letto è nel raggio del colore target. Considerare anche i valori del canale alfa.
Ciò lascerà un'immagine con un canale alfa e solo i colori che si cercano.
Secondo passaggio: Eseguire l'immagine attraverso una soluzione che utilizza l'algoritmo Piazze Marching (spudorato: ho fatto il mio here (licenza MIT) ispirata a questa domanda, e sembrano essere più veloci degli altri incl. il plugin D3 - ma chiunque lo farà!). Estrai i tracciati iterando sull'immagine, per ogni iterazione rimuovi la parte tracciata. Puoi farlo accedendo + riempiendo il percorso ottenuto usando la modalità composizione destination-out
. Usa una larghezza della linea di circa 3-5 specifica per il tuo scenario.
È possibile utilizzare Ramer-Douglas-Peucker per ridurre i punti o lasciarli così come sono. Nessuna riduzione del punto consentirà un percorso preciso ma peggiorerà anche.
Terzo passaggio: Ora si dispone di dati di percorso che è possibile utilizzare per ritagliare le parti dall'immagine originale. Aggiungi tutti i dati del percorso (usa i percorsi secondari usando moveTo() per ogni percorso), quindi la modalità composizione per rimuovere i pixel che non vuoi. Oppure, se sei solo dopo i percorsi: hai finito!
Qualsiasi immagine + Qualsiasi colore + Qualsiasi forma rende la domanda troppo ampia. Ma alcuni pensieri comunque: "Colore" nella tela è RGBA che è difficile da eguagliare se il target ha anche lievi variazioni di colore RGBA. Potresti convertire tutti i valori RGBA in HSL e quindi scegliere una tonalità che ti dia più tolleranza cromatica. "Shape" è ambiguo e una singola forma potrebbe essere una combinazione di più parti disconnesse, ma puoi eseguire il rilevamento di base dei bordi con [Marching Squares] (http://stackoverflow.com/questions/28207232/draw-border-around- algoritmo non trasparente-parte-dell'immagine-su-tela/28220510 # 28220510). – markE